|
AVR и AT45DB642D-SU, Не пишется инфа во flash |
|
|
|
May 18 2009, 03:24
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375

|
Вот пытаюсь писать данные во flash.
вот процедуры:
void AT45_write_buffer_begin(unsigned int addr) { AT45_CS_ON; AT45Ready(); SPI_Write_Byte(BUFFER_1_WRITE); // ok SPI_Write_Byte(0x00); SPI_Write_Byte((char)(addr>>13)); SPI_Write_Byte((char)addr); }
void AT45_buf_to_mem(unsigned int addr) { AT45_CS_ON; AT45Ready(); SPI_Write_Byte(BUFFER_1_TO_PAGE_WITH_ERASE); // ok SPI_Write_Byte((char)(addr>>8)); SPI_Write_Byte((char)(addr<<3)); SPI_Write_Byte(0x00); AT45Ready(); AT45_CS_OFF; }
void WRITE_BUFFER1_TO_MEM(unsigned char *m, unsigned int page) { unsigned int i; AT45_write_buffer_begin(0); for (i=0;i<PAGE_BYTES;i++) { SPI_Write_Byte(m[i]); } AT45_CS_OFF; AT45_buf_to_mem(page); }
void AT45_read_buffer_begin(unsigned int addr) { AT45_CS_ON; AT45Ready(); SPI_Write_Byte(BUFFER_1_READ); // ok SPI_Write_Byte(0); SPI_Write_Byte((char)(addr>>13)); SPI_Write_Byte((char)addr); }
void AT45_mem_to_buf(unsigned int addr) { AT45_CS_ON; AT45Ready(); SPI_Write_Byte(MAINPAGE_TO_BUFFER_1); // ok SPI_Write_Byte((char)(addr>>8)); SPI_Write_Byte((char)(addr<<3)); SPI_Write_Byte(0x00); AT45Ready(); AT45_CS_OFF; }
void READ_BUFFER1_FROM_MEM(unsigned char *m,unsigned int index,unsigned char count, unsigned int page) { unsigned int i; AT45_mem_to_buf(page); AT45_read_buffer_begin(0); for (i=index;i<PAGE_BYTES;i++) { if(i<(index+count)) { m[i-index]=SPI_Read_Byte(); } else SPI_Read_Byte(); } AT45_CS_OFF; }
#define PAGE_COUNT 8192 #define BLOCK_COUNT 1024 #define PAGE_BYTES 1056
#define BUFFER_1 0x00 #define BUFFER_2 0x01 #define BUFFER_1_WRITE 0x84 #define BUFFER_2_WRITE 0x87 #define BUFFER_1_READ 0xD1 #define BUFFER_2_READ 0xD3 #define BUFFER_1_TO_PAGE_WITH_ERASE 0x83 #define BUFFER_2_TO_PAGE_WITH_ERASE 0x86 #define MAINPAGE_TO_BUFFER_1 0x53 #define MAINPAGE_TO_BUFFER_2 0x55 #define PAGE_ERASE 0x81 #define BLOCK_ERASE 0x50 #define SECTOR_ERASE 0x7C
вот текст программы:
spi_init(); while(1) { TxData1(at45ReadVID()); TxData1(at45ReadStReG()); Del(1000); if(g==0) { g=1; AT45Mass[1]=0x0a; AT45Mass[200]=0x0b; WRITE_BUFFER1_TO_MEM(AT45Mass,10); Del(1000); AT45Mass[1]=0; AT45Mass[200]=0; READ_BUFFER1_FROM_MEM(AT45Mass,0,220,10); TxData1(AT45Mass[1]); TxData1(AT45Mass[200]); } }
выводятся нули. регистр статуса и id считываются. я такж епробовал записать в буфур 0 и потом считать оттуда - работало. а вот через память не получаеся. подскажите что не так ?
|
|
|
|
|
 |
Ответов
(1 - 12)
|
May 18 2009, 05:14
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Программные ошибки тут: Цитата(kostik2 @ May 18 2009, 07:24)  SPI_Write_Byte((char)(addr>>13)); Цитата(kostik2 @ May 18 2009, 07:24)  SPI_Write_Byte((char)(addr>>8)); Чересчур много сдвигаете. Подумайте. Но ошибка систематическая, при чтении и записи одинаковая, так что должно было записанное прочитаться все равно (только не туда куда надо). М.б. жело в железе, или security опциях. UPD: Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент.
Сообщение отредактировал SysRq - May 18 2009, 05:24
|
|
|
|
|
May 18 2009, 05:55
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(SysRq @ May 18 2009, 09:14)  Программные ошибки тут: Тут их нет, обратите внимание на скобки. Цитата(SysRq @ May 18 2009, 09:14)  UPD: Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент. Хорошо бы знать, что именно делает AT45Ready().
|
|
|
|
|
May 18 2009, 06:00
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375

|
Цитата(aaarrr @ May 18 2009, 09:55)  Тут их нет, обратите внимание на скобки.
Хорошо бы знать, что именно делает AT45Ready(). void AT45Ready(void) { while((PINC & BIT(3))){}; 3-бит - сигнал RDY }
|
|
|
|
|
May 18 2009, 09:17
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(aaarrr @ May 18 2009, 09:55)  Тут их нет, обратите внимание на скобки. Ммм.. Может я не выспался совсем?  Адрес внутри буфера: XXXXXXXX|XXXXXBBB|BBBBBBBB Собстно, это отправить по SPI (адрес - это uint16_t): ноль, старший от адреса, младший от адреса. Старший - это не 13 вправо, а всего 8. Во втором случае почти аналогично.
|
|
|
|
|
May 18 2009, 10:44
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375

|
Цитата(uriy @ May 18 2009, 11:29)  Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready AT45DB642D-SU - TSOP28
|
|
|
|
|
May 21 2009, 02:24
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375

|
да я пробовал в страницу с адресом 0 писать и читать. тут сдвиг не важен. не пишет и не считывает. пытался просто считать из страницы - считывает тоже 0. пипец какой-то. уже и местами менля AT45_ready и AT_DESELECT. ни фига.
|
|
|
|
|
May 21 2009, 06:49
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375

|
Цитата(kosyak© @ May 21 2009, 09:23)  Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию буду очень благодарен. шлите на kostiapan@mail.ru
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|