Jump to content

    
Sign in to follow this  
grishkin

at91sam7x256 FM25L256 SPI

Recommended Posts

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
А что конкретно посылаете? Или код приведите. Так гадать можно бесконечно.

 

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

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

 

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

Edited by grishkin

Share this post


Link to post
Share on other sites
А где инициализация, 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 );
}

Share this post


Link to post
Share on other sites
1. Еррату читали?

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

 

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

0. CPOL = 0 и CPHA = 0

3. CPOL = 1 и CPHA = 1

 

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

Share this post


Link to post
Share on other sites
Еррату не читал. Читал тока дока на неё.

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

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

Share this post


Link to post
Share on other sites
На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR.

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Почитал. Ничего подходящего под мой случай.

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

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

 

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

Share this post


Link to post
Share on other sites
И про NCPHA ничего не поняли?

 

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

 

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

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

 

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

Edited by grishkin

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this