grishkin 0 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Есть камень at91sam7x256 и фрамина FM25L256. Настроил SPI, смотрю асцилом клоки есть, чипселект отрабатывает как надо, MOSI есть, я вно вижу байты которые посылаю. Фрамина молчит, в чём может быть проблема? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Согласитесь, что так все же не бывает. Или с SPI не все так хорошо, как кажется, или непропай где-нибудь, или FRAM дохлая (что вряд ли). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grishkin 0 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Согласитесь, что так все же не бывает. Или с SPI не все так хорошо, как кажется, или непропай где-нибудь, или FRAM дохлая (что вряд ли). С ног контроллера всё вылетает, а вот назад не возвращается. Причём осцилом смотрю на ногах фрамины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба А что конкретно посылаете? Или код приведите. Так гадать можно бесконечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ashr 0 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Есть подозрение, что у микросхем этой серии проблемы с SPI. Я использовал FM25L64 c MSP430, сосед - ее же с at91sam7x256. Мы оба так и не смогли заставить память работать от встроенных в контроллеры модулей SPI. Но при этом все работает, если SPI сделать программный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grishkin 0 2 июня, 2008 Опубликовано 2 июня, 2008 (изменено) · Жалоба А что конкретно посылаете? Или код приведите. Так гадать можно бесконечно. Хочу просто прочесть статус регистр. t_error spi_write( u08 byte ) { while ( !( AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_TXEMPTY ) ); AT91F_SPI_PutChar( AT91C_BASE_SPI0, ( unsigned int )byte, 3 ); return SPI_ERR_SUCCESS; } ... spi_write( 0x05 ); spi_write( 0xAA ); AT91C_BASE_SPI0->SPI_CR |= AT91C_SPI_LASTXFER; b = spi_read(); ... Есть подозрение, что у микросхем этой серии проблемы с SPI. Я использовал FM25L64 c MSP430, сосед - ее же с at91sam7x256. Мы оба так и не смогли заставить память работать от встроенных в контроллеры модулей SPI. Но при этом все работает, если SPI сделать программный. А вот ваш ответ меня совсем не радует. Очень не хочеться делать велосипед. Изменено 2 июня, 2008 пользователем grishkin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Хочу просто прочесть статус регистр. А где инициализация, spi_read()? OFF: И снова AT91F_! Зачем усложнять себе и другим жизнь, а? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grishkin 0 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба А где инициализация, spi_read()? OFF: И снова AT91F_! Зачем усложнять себе и другим жизнь, а? Пожалуйста вот чего не хватает. t_error spi_init( void ) { AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, ((unsigned int) AT91C_PA17_SPI0_MOSI) | ((unsigned int) AT91C_PA16_SPI0_MISO) | ((unsigned int) AT91C_PA18_SPI0_SPCK) | ((unsigned int) AT91C_PA15_SPI0_NPCS3), 0); AT91F_PIO_CfgPeriph( AT91C_BASE_PIOB, 0, 0 ); AT91F_SPI0_CfgPMC(); AT91F_SPI_Reset( AT91C_BASE_SPI0 ); AT91F_SPI_CfgMode( AT91C_BASE_SPI0, AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED ); AT91F_SPI_CfgPCS( AT91C_BASE_SPI0, 0x07 ); AT91F_SPI_CfgCs( AT91C_BASE_SPI0, 3, AT91C_SPI_BITS_8 | AT91C_SPI_CSAAT | ( 48 << 8 ) | // Serial Clock Baud Rate ( 10 << 16 ) | // Delay Before SPCK ( 1 << 24 ) // Delay Between Consecutive Transfers ); AT91F_SPI_Enable( AT91C_BASE_SPI0 ); return SPI_ERR_SUCCESS; } u08 spi_read( void ) { while ( !( AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_TXEMPTY ) ); return ( u08 )AT91F_SPI_GetChar( AT91C_BASE_SPI0 ); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба 1. Еррату читали? 2. FM25L256 не умеет работать в SPI Mode 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grishkin 0 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба 1. Еррату читали? 2. FM25L256 не умеет работать в SPI Mode 1. Еррату не читал. Читал тока дока на неё. Там написано что держит 2 режима. 0. CPOL = 0 и CPHA = 0 3. CPOL = 1 и CPHA = 1 Пробовал оба режима, результат одинаковый. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Еррату не читал. Читал тока дока на неё. На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR. И в еррате на кучу приколов в Fixed Mode. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grishkin 0 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR. И в еррате на кучу приколов в Fixed Mode. Почитал. Ничего подходящего под мой случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InsolentS 0 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Вот, держите код, 100% работает именно на этом камне и именно с этой памятью ...инициализация spi... AT91F_SPI0_CfgPMC(); AT91F_PIO_CfgPeriph( PA, ((unsigned int) AT91C_PA17_SPI0_MOSI ) | ((unsigned int) AT91C_PA18_SPI0_SPCK ) | ((unsigned int) AT91C_PA16_SPI0_MISO ), 0x00); PA->PIO_PPUER=(AT91C_PA18_SPI0_SPCK); AT91C_BASE_SPI0->SPI_MR=(0<<24)|(0<<16)|(1<<4)|(0<<3)|1; AT91C_BASE_SPI0->SPI_CSR[0]=(0<<24)|(0<<16)|(8<<8)|(0<<4)|(1<<3)|(1<<1); AT91C_BASE_SPI0->SPI_CR=1; ... #define CMD_WREN 0x06 #define CMD_WRDI 0x04 #define CMD_RDSR 0x05 #define CMD_WRSR 0x01 #define CMD_READ 0x03 #define CMD_WRITE 0x02 #define EE_RDY (1<<0) #define EE_WEN (1<<1) #define EE_BP0 (1<<2) #define EE_BP1 (1<<3) #define EE_WPEN (1<<7) __inline void SPI_Write(unsigned char data) { AT91C_BASE_SPI0->SPI_TDR=data; while(!(AT91C_BASE_SPI0->SPI_SR&AT91C_SPI_TXEMPTY)); } __inline unsigned char SPI_Read(void) { SPI_Write(0x00); return AT91C_BASE_SPI0->SPI_RDR; } __inline void EE_CMD(unsigned char cmd) { PIO_PinClear(&SPI_CS); SPI_Write(cmd); PIO_PinSet(&SPI_CS); } __inline unsigned char EE_RDSR(void) { unsigned char temp; PIO_PinClear(&SPI_CS); SPI_Write(CMD_RDSR); temp=SPI_Read(); PIO_PinSet(&SPI_CS); return temp; } __inline void EE_Write(unsigned int addr, unsigned char const *buff, unsigned int cnt) { unsigned int i; EE_CMD(CMD_WREN); PIO_PinClear(&SPI_CS); SPI_Write(CMD_WRITE); SPI_Write((unsigned char)(addr>>8)); SPI_Write((unsigned char)addr); for(i=0;i<cnt;i++)SPI_Write(buff[i]); PIO_PinSet(&SPI_CS); } __inline void EE_Read(unsigned int addr, unsigned char *buff, unsigned int cnt) { unsigned int i; PIO_PinClear(&SPI_CS); SPI_Write(CMD_READ); SPI_Write((unsigned char)(addr>>8)); SPI_Write((unsigned char)addr); for(i=0;i<cnt;i++)buff[i]=SPI_Read(); PIO_PinSet(&SPI_CS); } PIO_PinSet, PIO_PinClear надо заменить на команды установки ноги, с хардверным маханием чего-то там не получилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 июня, 2008 Опубликовано 2 июня, 2008 · Жалоба Почитал. Ничего подходящего под мой случай. И про NCPHA ничего не поняли? И это - LASTXFER (Last Transfer) Behavior - не подходит под случай? Тогда пишите дальше, но лучше внимательно и вдумчиво прочитайте документацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grishkin 0 2 июня, 2008 Опубликовано 2 июня, 2008 (изменено) · Жалоба И про NCPHA ничего не поняли? Этот случай возникает только, когда SCBR = 1, CPOL = 1 and NCPHA = 0. И это - LASTXFER (Last Transfer) Behavior - не подходит под случай? Возникает в режиме PDC. Нитого нитого я не использую. Изменено 2 июня, 2008 пользователем grishkin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться