|
at91sam7x256 FM25L256 SPI, Не хочет работать |
|
|
|
Jun 2 2008, 06:53
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 22-01-08
Пользователь №: 34 302

|
Есть камень at91sam7x256 и фрамина FM25L256. Настроил SPI, смотрю асцилом клоки есть, чипселект отрабатывает как надо, MOSI есть, я вно вижу байты которые посылаю. Фрамина молчит, в чём может быть проблема?
|
|
|
|
|
Jun 2 2008, 07:10
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 22-01-08
Пользователь №: 34 302

|
Цитата(aaarrr @ Jun 2 2008, 11:06)  Согласитесь, что так все же не бывает. Или с SPI не все так хорошо, как кажется, или непропай где-нибудь, или FRAM дохлая (что вряд ли). С ног контроллера всё вылетает, а вот назад не возвращается. Причём осцилом смотрю на ногах фрамины.
|
|
|
|
|
Jun 2 2008, 07:37
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 22-01-08
Пользователь №: 34 302

|
Цитата(aaarrr @ Jun 2 2008, 11:13)  А что конкретно посылаете? Или код приведите. Так гадать можно бесконечно. Хочу просто прочесть статус регистр. Код 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(); ... Цитата(shreck @ Jun 2 2008, 11:23)  Есть подозрение, что у микросхем этой серии проблемы с SPI. Я использовал FM25L64 c MSP430, сосед - ее же с at91sam7x256. Мы оба так и не смогли заставить память работать от встроенных в контроллеры модулей SPI.
Но при этом все работает, если SPI сделать программный. А вот ваш ответ меня совсем не радует. Очень не хочеться делать велосипед.
Сообщение отредактировал grishkin - Jun 2 2008, 07:39
|
|
|
|
|
Jun 2 2008, 08:04
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 22-01-08
Пользователь №: 34 302

|
Цитата(aaarrr @ Jun 2 2008, 11:49)  А где инициализация, 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 ); }
|
|
|
|
|
Jun 2 2008, 08:22
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 22-01-08
Пользователь №: 34 302

|
Цитата(aaarrr @ Jun 2 2008, 12:11)  1. Еррату читали? 2. FM25L256 не умеет работать в SPI Mode 1. Еррату не читал. Читал тока дока на неё. Там написано что держит 2 режима. 0. CPOL = 0 и CPHA = 0 3. CPOL = 1 и CPHA = 1 Пробовал оба режима, результат одинаковый.
|
|
|
|
|
Jun 2 2008, 08:45
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 22-01-08
Пользователь №: 34 302

|
Цитата(aaarrr @ Jun 2 2008, 12:34)  На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR. И в еррате на кучу приколов в Fixed Mode. Почитал. Ничего подходящего под мой случай.
|
|
|
|
|
Jun 2 2008, 08:46
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Вот, держите код, 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 надо заменить на команды установки ноги, с хардверным маханием чего-то там не получилось.
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Jun 2 2008, 10:04
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 22-01-08
Пользователь №: 34 302

|
Цитата(aaarrr @ Jun 2 2008, 12:51)  И про NCPHA ничего не поняли? Этот случай возникает только, когда SCBR = 1, CPOL = 1 and NCPHA = 0. Цитата И это - LASTXFER (Last Transfer) Behavior - не подходит под случай? Возникает в режиме PDC. Нитого нитого я не использую.
Сообщение отредактировал grishkin - Jun 2 2008, 10:05
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|