Перейти к содержанию
    

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласитесь, что так все же не бывает. Или с SPI не все так хорошо, как кажется, или непропай где-нибудь, или FRAM дохлая (что вряд ли).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласитесь, что так все же не бывает. Или с SPI не все так хорошо, как кажется, или непропай где-нибудь, или FRAM дохлая (что вряд ли).

 

С ног контроллера всё вылетает, а вот назад не возвращается. Причём осцилом смотрю на ногах фрамины.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть подозрение, что у микросхем этой серии проблемы с SPI. Я использовал FM25L64 c MSP430, сосед - ее же с at91sam7x256. Мы оба так и не смогли заставить память работать от встроенных в контроллеры модулей SPI.

 

Но при этом все работает, если SPI сделать программный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что конкретно посылаете? Или код приведите. Так гадать можно бесконечно.

 

Хочу просто прочесть статус регистр.

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 сделать программный.

 

А вот ваш ответ меня совсем не радует. Очень не хочеться делать велосипед.

Изменено пользователем grishkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу просто прочесть статус регистр.

А где инициализация, spi_read()?

 

OFF: И снова AT91F_! Зачем усложнять себе и другим жизнь, а?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где инициализация, 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 );
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Еррату читали?

2. FM25L256 не умеет работать в SPI Mode 1.

 

Еррату не читал. Читал тока дока на неё. Там написано что держит 2 режима.

0. CPOL = 0 и CPHA = 0

3. CPOL = 1 и CPHA = 1

 

Пробовал оба режима, результат одинаковый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еррату не читал. Читал тока дока на неё.

На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR.

И в еррате на кучу приколов в Fixed Mode.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR.

И в еррате на кучу приколов в Fixed Mode.

 

Почитал. Ничего подходящего под мой случай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот, держите код, 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 надо заменить на команды установки ноги, с хардверным маханием чего-то там не получилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почитал. Ничего подходящего под мой случай.

И про NCPHA ничего не поняли?

И это - LASTXFER (Last Transfer) Behavior - не подходит под случай?

 

Тогда пишите дальше, но лучше внимательно и вдумчиво прочитайте документацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И про NCPHA ничего не поняли?

 

Этот случай возникает только, когда SCBR = 1, CPOL = 1 and NCPHA = 0.

 

И это - LASTXFER (Last Transfer) Behavior - не подходит под случай?

Возникает в режиме PDC.

 

Нитого нитого я не использую.

Изменено пользователем grishkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...