реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> SD карта не просыпается
adc
сообщение Jun 2 2009, 06:19
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Цитата(svchost @ Jun 2 2009, 00:03) *
...
Пока разбирался с инициализации написал подсчет CRC7 на ASM (могу поделиться)
...

Было бы интересно взглянуть. rolleyes.gif


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2009, 07:33
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Jun 2 2009, 08:02) *
Ncr может быть от 0 до 8 байт.

Ncr - до 8, Nrc - 1.

Цитата(sonycman @ Jun 2 2009, 08:02) *
Что характерно, действительно после любой команды нужно подавать 1 байт холостого чтения, иначе карта не будет нормально воспринимать следующую команду...

Вот это и есть Nrc.
Go to the top of the page
 
+Quote Post
svchost
сообщение Jun 3 2009, 20:08
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



Цитата(adc @ Jun 2 2009, 10:19) *
Было бы интересно взглянуть. rolleyes.gif


Пожалуйста...

CLR CRC
...
LDI A,$40
CALL CRC7
...

Сообщение отредактировал svchost - Jun 3 2009, 20:17
Прикрепленные файлы
Прикрепленный файл  crc7.rar ( 708 байт ) Кол-во скачиваний: 37
 
Go to the top of the page
 
+Quote Post
adc
сообщение Jun 4 2009, 06:57
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Цитата(svchost @ Jun 4 2009, 00:08) *
Пожалуйста...
..

Спасибо!
Несколько сыровато. Код непроверенный?


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2009, 07:25
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(adc @ Jun 4 2009, 10:57) *
Несколько сыровато. Код непроверенный?

Да уж, надо было так запутать sad.gif

Вот что получается, если написать просто "в лоб":
Код
; X - указатель на данные,
; b - длина

crc7:
    clr    crc
    ldi    d, 0x12
crc7_0:
    ld    a, X+
    eor    crc, a
    ldi    c, 8
crc7_1:
    lsl    crc
    brcc    PC+0x02
    eor    crc, d
    dec    c
    brne    crc7_1
    dec    b
    brne    crc7_0
    ori    crc, 1
    ret
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 4 2009, 10:57
Сообщение #21


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



А я в сети нашёл такой код:
Код
u8    CRC7(u8* chr, int cnt)
{
    int i,a;
    u8 crc = 0, data;

    for (a=0; a < cnt; a++)
    {
        data=chr[a];
        for (i=0; i < 8; i++)
        {
            crc <<= 1;
            if ((data ^ crc) & 0x80) crc ^= 0x09;
            data <<= 1;
        }
    }
    return    crc;
}

Интересно, нельзя никак избежать побитного цикла (i), чтобы ускорить рассчёт?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2009, 11:14
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Jun 4 2009, 14:57) *
Интересно, нельзя никак избежать побитного цикла (i), чтобы ускорить рассчёт?

Можно, конечно. Хотя ускорять рассчет 5 байт большого смысла нет.
Вот для данных - это другое дело.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 4 2009, 11:46
Сообщение #23


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(aaarrr @ Jun 4 2009, 15:14) *
Можно, конечно. Хотя ускорять рассчет 5 байт большого смысла нет.

Это понятно, но всё равно интересно - как?
В сети нигде не нашёл работающего примера без битового цикла...

Для данных это да. Но для SPI сумма не нужна (странно, конечно, но неужели надёжность SPI близка к 100%, чтобы в контрольной сумме отпала надобность?), а SDIO контроллеры будут считать её аппаратно...

ЗЫ: вот ваша процедура на Си, она пооптимальнее, чем приведённая мной:
Код
u8    CRC7(u8* chr, int cnt)
{
    int i,a;
    u8 crc = 0;

    for (a=0; a < cnt; a++)
    {
        crc ^= chr[a];
        for (i=0; i < 8; i++)
        {
            if (crc & 0x80)
            {
                crc <<= 1;
                crc ^= 0x12;
            }
            else crc <<= 1;
        }
    }
    crc |= 1;
    return    crc;
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2009, 12:00
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Jun 4 2009, 15:46) *
Это понятно, но всё равно интересно - как?

Табличкой, например.

Цитата(sonycman @ Jun 4 2009, 15:46) *
Для данных это да. Но для SPI сумма не нужна (странно, конечно, но неужели надёжность SPI близка к 100%, чтобы в контрольной сумме отпала надобность?), а SDIO контроллеры будут считать её аппаратно...

Для SPI ее можно не включать, но это не значит, что она не нужна. Я, например, включаю и использую.

Цитата(sonycman @ Jun 4 2009, 15:46) *
ЗЫ: вот ваша процедура на Си, она пооптимальнее, чем приведённая мной:

Спасибо, конечно, а я-то специально на асм переводил smile.gif

Если интересно, то вот вариант для данных:
Код
const u_short sd_crc16_table_a[0x10] =
{
    0x0000, 0x1231, 0x2462, 0x3653,
    0x48c4, 0x5af5, 0x6ca6, 0x7e97,
    0x9188, 0x83b9, 0xb5ea, 0xa7db,
    0xd94c, 0xcb7d, 0xfd2e, 0xef1f
};

const u_short sd_crc16_table_b[0x10] =
{
    0x0000, 0x1021, 0x2042, 0x3063,
    0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b,
    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

u_int sd_crc16(u_char *buff, u_int len)
{
    u_char data;
    u_short crc = 0;

    while(len--)
    {
        data = *buff++ ^ (crc >> 0x08);
        crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8);
    }
    return crc;
}
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 4 2009, 12:26
Сообщение #25


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(aaarrr @ Jun 4 2009, 16:00) *
Табличкой, например.

Да, это вариант. Но самое прикольное - это хитрые варианты, когда без таблиц и без цилов, быстрое вычисление всего лишь несколькими командами.
Наверное, такое возможно не всегда...

Цитата(aaarrr @ Jun 4 2009, 16:00) *
Если интересно, то вот вариант для данных:

Спасибо, красивая реализация, небольшие таблички и минимум вычислений smile.gif
Go to the top of the page
 
+Quote Post
svchost
сообщение Jun 4 2009, 15:45
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



Цитата(aaarrr @ Jun 4 2009, 11:25) *
Да уж, надо было так запутать sad.gif

Вот что получается, если написать просто "в лоб":
Код
; X - указатель на данные,
; b - длина

crc7:
    clr    crc
    ldi    d, 0x12
crc7_0:
    ld    a, X+
    eor    crc, a
    ldi    c, 8
crc7_1:
    lsl    crc
    brcc    PC+0x02
    eor    crc, d
    dec    c
    brne    crc7_1
    dec    b
    brne    crc7_0
    ori    crc, 1
    ret



Подпрограмма CRC7 полностью работоспособна.
У каждого свое решение. Считаю, что мой вариант полностью отражает
алгоритм подсчета CRC7 и вполне понятен.

Спасибо.

Сообщение отредактировал svchost - Jun 4 2009, 15:51
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2009, 17:52
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(svchost @ Jun 4 2009, 19:45) *
Подпрограмма CRC7 полностью работоспособна.
У каждого свое решение. Считаю, что мой вариант полностью отражает
алгоритм подсчета CRC7 и вполне понятен.

Я лишь предложил более короткий и быстрый вариант. Не обижайтесь.
Go to the top of the page
 
+Quote Post
ivstech
сообщение Jun 4 2009, 18:05
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Цитата(sonycman @ Jun 4 2009, 18:26) *
<br />Да, это вариант. Но самое прикольное - это хитрые варианты, когда без таблиц и без цилов

Когда флэша нехватает, я использую такой код
Код
; in/out YH аккумулятор
; in R18 следующий байт
CRC7Update:
   eor YH, R18
  ; Левый полубайт
   mov R19, YH
   andi R19, 0xF0
   swap R19
   eor YH, R19
   swap R19
   add R19, R19
   brcc CRC7Skip
   ldi YL, 0x01
   eor YH, YL
CRC7Skip:
   mov YL, R19
  ; Правый полубайт
   mov R19, YH
   andi R19, 0x0F
   swap R19
   eor YL, R19
   swap R19
   add R19, R19
   eor YL, R19
   mov YH, YL
   ret

и
Код
; IN:  R4, R5 - аккумулятор CRC
;      R18 - значение
; OUT: R4, R5

; По модулю 0x11021
CRC16Update:
   push R18
   push R19
   eor R4, R18
  ; Левый полубайт
   mov R19, R4
   andi R19, 0xF0
   mov R18, R19
   swap R19
   eor R4, R19
   add R19, R19
   eor R5, R19
  ; Правый полубайт
   mov R19, R4
   andi R19, 0x0F
   eor R18, R19
   swap R19
   eor R5, R19
   add R19, R19
   brcc CRC16Skip
   clr R4
   inc R4
   eor R5, R4
CRC16Skip:
   eor R18, R19
   mov R4, R5
   mov R5, R18
   pop R19
   pop R18
   ret
Go to the top of the page
 
+Quote Post
adc
сообщение Jun 5 2009, 06:38
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



to ivstech and aaarrr: странно но результат вычисления CRC7 ваших алгоритмов разный.?! это нормально? rolleyes.gif
разница в этой строчке у Вас aaarrr:
Код
ori    crc, 1

Зачем она?


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2009, 07:05
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(adc @ Jun 5 2009, 10:38) *
Зачем она?

Считаем мы CRC7, а это end bit - см. Command Format в спецификации SD.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016