kostik2 0 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба Вот пытаюсь писать данные во 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); } 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 и потом считать оттуда - работало. а вот через память не получаеся. подскажите что не так ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grigory2000 0 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба А это не опечатка, что в некоторых процедурах чипселект не отпускается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 18 мая, 2009 Опубликовано 18 мая, 2009 (изменено) · Жалоба Программные ошибки тут: SPI_Write_Byte((char)(addr>>13)); SPI_Write_Byte((char)(addr>>8));Чересчур много сдвигаете. Подумайте. Но ошибка систематическая, при чтении и записи одинаковая, так что должно было записанное прочитаться все равно (только не туда куда надо). М.б. жело в железе, или security опциях. UPD: Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент. Изменено 18 мая, 2009 пользователем SysRq Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба Программные ошибки тут: Тут их нет, обратите внимание на скобки. UPD: Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент. Хорошо бы знать, что именно делает AT45Ready(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostik2 0 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба Тут их нет, обратите внимание на скобки. Хорошо бы знать, что именно делает AT45Ready(). void AT45Ready(void) { while((PINC & BIT(3))){}; 3-бит - сигнал RDY } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба Тут их нет, обратите внимание на скобки.Ммм.. Может я не выспался совсем? :cranky: Адрес внутри буфера: XXXXXXXX|XXXXXBBB|BBBBBBBB Собстно, это отправить по SPI (адрес - это uint16_t): ноль, старший от адреса, младший от адреса. Старший - это не 13 вправо, а всего 8. Во втором случае почти аналогично. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба Ммм.. Может я не выспался совсем? :cranky: Не, это я не выспался :) С адресами там все неправильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostik2 0 18 мая, 2009 Опубликовано 18 мая, 2009 · Жалоба Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready AT45DB642D-SU - TSOP28 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostik2 0 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба да я пробовал в страницу с адресом 0 писать и читать. тут сдвиг не важен. не пишет и не считывает. пытался просто считать из страницы - считывает тоже 0. пипец какой-то. уже и местами менля AT45_ready и AT_DESELECT. ни фига. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostik2 0 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию буду очень благодарен. шлите на [email protected] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба void AT45Ready(void) { while((PINC & BIT(3))){}; 3-бит - сигнал RDY } А линия RDY\BUSY к питанию подтянута? У м\с памяти это выход open drain. И не понятно почему у вас AT45Ready ждет появления лог. 0, а не 1, как должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться