Добрый день! Есть задача прошить Attiny через spi c помощью другого контроллера. Сам обмен с контроллером происходит нормально, возвращается байт 0x53, но есть вопрос по поводу алгоритмов записи и чтения, у меня он происходит как-то не корректно, возможно я что-то упустил. С начала я посылаю команду Programming Enable, получаю необходимый байт 0x53(третий), потом посылаю комманду Chip Erase (которая происходит успешно), получаю сдвинутые байты.
Теперь самое интересное, запись. Я выполняю команды Load Instruction(сначала загужаю младший байт): -Load Program Memory Page, Low byte -Load Program Memory Page, Hight byte
Для примера, есть массив c 6 байт array[6] = { 1, 2, 3, 4, 5, 6 }; для загрузки я делаю следующее: 0x40 0x00 0x00(адрес) 0x01(младший байт) 0x48 0x00 0x00(адрес) 0x02(старший байт)
0x40 0x00 0x01(адрес) 0x03(младший байт) 0x48 0x00 0x01(адрес) 0x04(старший байт)
0x40 0x00 0x02(адрес) 0x05(младший байт) 0x48 0x00 0x02(адрес) 0x06(старший байт)
Потом выполняю инструкцию Write Program Memory Page: 0x4C adr_MSB adr_LSB 0x00, где adr_MSB - это номер страницы(даташит, рис. 21.8), а Add_LSB смещение относ. базового адреса страницы. Начальный адресс флешь = 0x00.
0x4C 0x00(первая страница) 0x00(смещение относ. адреса текущей стр.) 0x00(всегда 0) - запись первого слова; 0x4C 0x00(первая страница) 0x01(смещение относ. адреса текущей стр.) 0x00(всегда 0) - запись второго слова(2-ух байт); 0x4C 0x00(первая страница) 0x02(смещение относ. адреса текущей стр.) 0x00(всегда 0) - запись третего слова;
Чтение: Выполняю инструкцию Read(нужно прочитать 6 байт, те которые и записал...если записал): Read Program Memory, Low byte 0x20 addr_MSB(номер стр.) adr_LSB(смещ. относ. адреса текущей стр.), любой байт(вернет low_data_byte); Read Program Memory, High byte...
0x20 0x00(номер стр.) 0x00(смещ.) X(любой байт - возвр. low_data_byte) - должен получить значение "1" 0x28 0x00(номер стр.) 0x00(смещ.) X(любой байт - возвр. high_data_byte) - должен получить значение "2"
0x20 0x00(номер стр.) 0x01(смещ.) X(любой байт - возвр. low_data_byte) - должен получить значение "3" 0x28 0x00(номер стр.) 0x01(смещ.) X(любой байт - возвр. high_data_byte) - должен получить значение "4"
0x20 0x00(номер стр.) 0x02(смещ.) X(любой байт - возвр. low_data_byte) - должен получить значение "5" 0x28 0x00(номер стр.) 0x02(смещ.) X(любой байт - возвр. high_data_byte) - должен получить значение "6"
На самом деле, когда я по такому алгоритму записываю байт 50(сначала загружаю load, потом write, потом читаю) получается при чтении не то-что я писал, какая-то каша...когда пишу 6 байт, как у примере, то не записывается первый байт, а остальные 5 запис., опять же при увелич. колич. записанных байт за раз выходи каша.
Возможно я не правильно понял алгоритм записи и чтения, буду благодарен за просветление.
|