tMauzer 0 21 мая, 2010 Опубликовано 21 мая, 2010 · Жалоба Не поможет ли кто примерчиком общения с AT25DF641 флэшкой? Хочется побыстрее её запустуть, потому что дальше интереснее... но не получается. Взял пример от Атмела для АТ26, но он не работает. AT26_ReadJedecId(&at26); всегда возвращает 0. Вроде как всё просто, но как-то глухо :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 21 мая, 2010 Опубликовано 21 мая, 2010 · Жалоба Хочется побыстрее её запустуть, потому что дальше интереснее... но не получается. Если не понимаете, даже с примером, как оно работает, то дальше будет не интереснее, а просто хуже. Посему не надо торопится. Разбирайтесь спокойно. Ну а поскольку Вы спрашиваете на как 2*2 написать, а как работать с железом, то для начала разберитесь, чем Ваше неназванное железо отличается от того, которое в "пример от Атмела". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tMauzer 0 21 мая, 2010 Опубликовано 21 мая, 2010 · Жалоба Железо - это практически копия at91sam7x-ek. На SPI0 на CS1 сидит флешка AT25DF641. Я взял spi-flash/at26.h библиотечку с Атмела. В ней, правда, небыло AT25DF641 в at26Devices[]. Я её добавил, но это не принципиально поску до этого не доходит посколку я неполучаю ответ на команду 0x9F. Сижу разбираюсь с библиотечкой, но библиотека at26.h + драйвер spid.h + ещё несколько необходимых для этого библиотечек (pio, aic, trace, math и т.д.) - как-то немного сильно покручено. Хотел спросить, может есть у кого-то пример по проще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 21 мая, 2010 Опубликовано 21 мая, 2010 · Жалоба Не поможет ли кто примерчиком общения с AT25DF641 флэшкой? AT25 - EEPROM, AT26 - FLASH. Вот о чём пытался намекнуть вам zltigo. Вот минимальный набор для работы с at25: #include "at25.h" #define AT25_CS 3, 3, L // at25 чипселект // EEPROM commands #define EE_READ 3 #define EE_WRITE 2 #define EE_WREN 6 #define EE_WRDI 4 #define EE_RDSR 5 #define EE_WRSR 1 // EEPROM status #define SS_WRITING 0x01 // Write cycle in progress #define SS_WRITE_ENABLE 0x02 // Write enabled void at25_init(void) { direct(AT25_CS,O); // переключаем ногу чипселекта на выход off(AT25_CS); // отключаем (высокий уровень) } void at25_command(char cmd) { on(AT25_CS); spi_w(cmd); } uint8_t at25_read_status(void) { int result; at25_command(EE_RDSR); result = spi_r8(); off(AT25_CS); return result; } uint8_t at25_read_byte(uint16_t adr) { uint8_t result; at25_command(EE_READ); spi_w(adr >> 8); spi_w(adr); result = spi_r8(); off(AT25_CS); return result; } void at25_read(uint16_t adr, uint8_t *bf, uint16_t len) { at25_command(EE_READ); spi_w(adr >> 8); spi_w(adr); while (len--) *bf++ = spi_r8(); off(AT25_CS); } void at25_write_byte(uint16_t adr, uint8_t data) { at25_command(EE_WREN); off(AT25_CS); // toggle CS, necessary for WREN at25_command(EE_WRITE); spi_w(adr >> 8); spi_w(adr); spi_w(data); off(AT25_CS); while (at25_read_status()& SS_WRITING); } void at25_write(uint16_t adr, uint8_t *bf, uint16_t len) { while (len--) at25_write_byte(adr++, *bf++); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tMauzer 0 21 мая, 2010 Опубликовано 21 мая, 2010 (изменено) · Жалоба AHTOXA, ОГРОМНОЕ СПАСИБО!!! А в амеловских доках написано: "The AT25DF641 is a serial interface Flash memory device". :unsure: Изменено 21 мая, 2010 пользователем tMauzer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grigan 0 4 декабря, 2010 Опубликовано 4 декабря, 2010 · Жалоба AHTOXA, ОГРОМНОЕ СПАСИБО!!! А в амеловских доках написано: "The AT25DF641 is a serial interface Flash memory device". :unsure: Не подскажете где вы взяли библиотеку spi-flash/at26.h..? и какой компилятор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 4 декабря, 2010 Опубликовано 4 декабря, 2010 (изменено) · Жалоба at91lib_20100901_softpack_1_9_v_1_0_svn_v15011.zip в 1.7 тоже есть. Может быть и в 1.5 http://www.atmel.com/dyn/products/tools_ca...sp?tool_id=4343 Изменено 4 декабря, 2010 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 7 сентября, 2011 Опубликовано 7 сентября, 2011 (изменено) · Жалоба Здравствуйте! Не буду создавать новую тему, спрошу тут: У меня LPC2468 и микросхема AT25DF321A подключенная по SSP1. Пытаюсь заставить ее работать, но не в какую (не могу даже получить Manufacture ID, приходит в ответ или 0x00 или 0xFF). Уже перекурил даташиты несколько раз (и на контроллер и на память). Инициализация SSP1 DWORD SSP1Init( void ) { BYTE i, Dummy=Dummy; PCONP |= (1 << 10); // PCSSP1 PCLKSEL0 |= (1 << 20); // Peripheral Clock Selection for SSP1 <3=> Pclk = Cclk PINSEL9 &= ~(3 << 10); // Set SSEL to GPIO pin PINSEL9 |= (3 << 8) | (3 << 12) | (3 << 14); // P4.20 - SCK1, P4.22 - MISO1, P4.23 - MOSI1 FPIN_AS_OUTPUT_(4,21); FPIN_SET_(4,21); SSP1CR0 = 0x0707;//(7 << 0) | (1 << 6) | (1 << 7) | (1 << 8);//0x0707; // Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15 SSP1CPSR = 0x02; for ( i = 0; i < FIFOSIZE; i++ ) {Dummy = SSP1DR;} // clear the RxFIFO SSP1CR1 = SSPCR1_SSE; // Device select as master, SSP Enabled return( TRUE ); } Теперь сам код запроса: volatile int Flash1_ManID,Flash1_MemType1,Flash1_MemType2,Flash1_MemSize = 0; void Flash1_ReadType(void) { FPIN_CLR_(4,21); SSP1DR = 0x9F; while ( !(SSP1SR & SSPSR_BSY) ); // SSPSR_TFE SSPSR_RNE Flash1_ManID = SSP1DR; Flash1_MemType1 = SSP1DR; Flash1_MemType2 = SSP1DR; Flash1_MemSize = SSP1DR; FPIN_SET_(4,21); } В итоге из SSP1DR идут одни нули...(изредка один из байтов - 0xFF) Вначале думал что проблема в скорости - перебирал в регистре SSP1CR0 значения: 0x0107, 0x0707, 0x0007; перебирал значения в регистре SSP1CPSR: 0x01 до 0x40 Но с другой стороны AT25DF321A работает до 100 МГц, а у меня максимум что получалось - 18МГц (Master Clock в окне отладки Keil) Уперся в эту хрень и уже 2 дня не могу ничего сделать... Где же я ошибся? Добавлено: Проверяю на осциллографе - SCK работает - четко 8 тактов. Но на MISO - тишина... Изменено 7 сентября, 2011 пользователем yurmala Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 7 сентября, 2011 Опубликовано 7 сентября, 2011 · Жалоба Не устану повторять: SPI - такая штука: Чтобы что-то прочитать, надо что-то записать! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 7 сентября, 2011 Опубликовано 7 сентября, 2011 (изменено) · Жалоба Не устану повторять: SPI - такая штука: Чтобы что-то прочитать, надо что-то записать! Хм....кажется начал понимать. В SPI (SSP) регистр сдвиговый. Байт записал - байт прочитал? Изменено 7 сентября, 2011 пользователем yurmala Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 7 сентября, 2011 Опубликовано 7 сентября, 2011 · Жалоба Именно! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 7 сентября, 2011 Опубликовано 7 сентября, 2011 (изменено) · Жалоба Как-то странно все пока... Поменял код: volatile unsigned int ManID,MemType,MemType1,MemType2,MemSize; void Flash_ReadType(void) { FPIN_CLR(4,21); SSP1DR = 0x9F; SSP1DR = 0; SSP1DR = 0; while ( !(SSP1SR & SSPSR_BSY) ); ManID = SSP1DR; // В SSP1DR 0xFF, но при чтении в переменную попадает 0x1F MemType = SSP1DR; // В SSP1DR 0x47, но при чтении в переменную попадает 0x01 MemSize = SSP1DR; // В SSP1DR 0x01, но при чтении в переменную попадает 0x00 FPIN_SET(4,21); } Если выполнять пошагово - в дебаггере Keil вижу в регистре SSP1DR нужные данные - 1F,47,01, да и то - не всегда. Иногда вижу 1F и 01, а 47 теряется... А если в отладчике выполнить функцию целиком (F10) то в переменные записываются нули... Изменено 7 сентября, 2011 пользователем yurmala Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 7 сентября, 2011 Опубликовано 7 сентября, 2011 · Жалоба Получилось вот с таким кодом. Но не могу понять откуда возникает первый непонятный байт, который я считываю в Dummy. Может я это как-то не так понял? Считывание ManufactureID volatile unsigned int ManID,MemType,MemType1,MemType2,MemSize; void Flash_ReadType(void) { BYTE Dummy = Dummy; FPIN_CLR(4,21); SSP1DR = 0x9F; SSP1DR = 0; SSP1DR = 0; SSP1DR = 0; while ( !(SSP1SR & SSPSR_BSY) ); Dummy = SSP1DR; // Всегда 0xFF ManID = SSP1DR; MemType = SSP1DR; MemSize = SSP1DR; FPIN_SET(4,21); } Считывание 2-х байтного статусного регистра volatile unsigned int RegStat1,RegStat2; void Flash_ReadStatus(void) { BYTE Dummy = Dummy; FPIN_CLR(4,21); SSP1DR = 0x05; SSP1DR = 0; while ( !(SSP1SR & SSPSR_BSY) ); Dummy = SSP1DR; // Всегда 0xFF RegStat1 = SSP1DR; RegStat2 = SSP1DR; FPIN_SET(4,21); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 7 сентября, 2011 Опубликовано 7 сентября, 2011 · Жалоба Может я это как-то не так понял? Не так. Последовательность записал - прочитал надо выполнять для каждого байта. Я не работал с LPC2468, но исходя из общих соображений должно быть как-то так: uint8_t spi_rw(uint8_t b) { SSP1DR = b; // передаём while ( !(SSP1SR & SSPSR_RNE) ); // ждём пока примется return SSP1DR; } ... spi_rw(0x9F); ManID = spi_rw(0); MemType = spi_rw(0); MemSize = spi_rw(0); ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yurmala 0 7 сентября, 2011 Опубликовано 7 сентября, 2011 (изменено) · Жалоба Да. Получилось. Спасибо. А как тогда эта система работает при чтении/записи произвольных данных? Ведь там надо еще 3 байта адреса передавать + 2 dummy байта? Как это будет выглядеть? Так что ли? Чтение данных с адреса Х spi_rw(0x1B); spi_rw(X >> 16); spi_rw(X >> 8); spi_rw(X); spi_rw(0); //dummy 1 spi_rw(0); //dummy 2 for (...) { buf++ = spi_rw(0); } Изменено 7 сентября, 2011 пользователем yurmala Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться