Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at91sam7x256 FM25L256 SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
grishkin
Есть камень at91sam7x256 и фрамина FM25L256. Настроил SPI, смотрю асцилом клоки есть, чипселект отрабатывает как надо, MOSI есть, я вно вижу байты которые посылаю. Фрамина молчит, в чём может быть проблема?
aaarrr
Согласитесь, что так все же не бывает. Или с SPI не все так хорошо, как кажется, или непропай где-нибудь, или FRAM дохлая (что вряд ли).
grishkin
Цитата(aaarrr @ Jun 2 2008, 11:06) *
Согласитесь, что так все же не бывает. Или с SPI не все так хорошо, как кажется, или непропай где-нибудь, или FRAM дохлая (что вряд ли).


С ног контроллера всё вылетает, а вот назад не возвращается. Причём осцилом смотрю на ногах фрамины.
aaarrr
А что конкретно посылаете? Или код приведите. Так гадать можно бесконечно.
shreck
Есть подозрение, что у микросхем этой серии проблемы с SPI. Я использовал FM25L64 c MSP430, сосед - ее же с at91sam7x256. Мы оба так и не смогли заставить память работать от встроенных в контроллеры модулей SPI.

Но при этом все работает, если SPI сделать программный.
grishkin
Цитата(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 сделать программный.


А вот ваш ответ меня совсем не радует. Очень не хочеться делать велосипед.
aaarrr
Цитата(grishkin @ Jun 2 2008, 11:37) *
Хочу просто прочесть статус регистр.

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

OFF: И снова AT91F_! Зачем усложнять себе и другим жизнь, а?
grishkin
Цитата(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 );
}
aaarrr
1. Еррату читали?
2. FM25L256 не умеет работать в SPI Mode 1.
grishkin
Цитата(aaarrr @ Jun 2 2008, 12:11) *
1. Еррату читали?
2. FM25L256 не умеет работать в SPI Mode 1.


Еррату не читал. Читал тока дока на неё. Там написано что держит 2 режима.
0. CPOL = 0 и CPHA = 0
3. CPOL = 1 и CPHA = 1

Пробовал оба режима, результат одинаковый.
aaarrr
Цитата(grishkin @ Jun 2 2008, 12:22) *
Еррату не читал. Читал тока дока на неё.

На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR.
И в еррате на кучу приколов в Fixed Mode.
grishkin
Цитата(aaarrr @ Jun 2 2008, 12:34) *
На SAM7 доку тоже стоит почитать. Обратите внимание на бит NCPHA в SPI_CSR.
И в еррате на кучу приколов в Fixed Mode.


Почитал. Ничего подходящего под мой случай.
InsolentS
Вот, держите код, 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
Цитата(grishkin @ Jun 2 2008, 12:45) *
Почитал. Ничего подходящего под мой случай.

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

Тогда пишите дальше, но лучше внимательно и вдумчиво прочитайте документацию.
grishkin
Цитата(aaarrr @ Jun 2 2008, 12:51) *
И про NCPHA ничего не поняли?


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

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

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

Нитого нитого я не использую.
aaarrr
Цитата(grishkin @ Jun 2 2008, 14:04) *
Этот случай возникает только, когда SCBR = 1, CPOL = 1 and NCPHA = 0.

Полярность этого бита - NPCHA - инверсная, для режима SPI 0 он должен быть установлен.
grishkin
Спасибо за NCPHA. Всё заработало. Уменя были недобрые подозрения в разном названии пинов и режимов в документации на фрамену и на камень. А как только увидел ваш пост сразу мелькнуло - "облажался".
Куда высылать пиво? =))
aaarrr
Эт хорошо, что заработало, а то я уже и не знал, как донести мысль smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.