реклама на сайте
подробности

 
 
> AT91SAM7S32 + AT45DB161C, проблемма
Tcom
сообщение Jun 26 2008, 07:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



Доброго времени суток!!
Связываю вышеупомянутыеи МС.
Записываю массив в буфер 1 at45, а потом читаю массив с буфера 1.
Почемуто все значения оказываются делёнными на 2.

инициализация SPI:
Код
void initSPI (void)
{
  AT91C_BASE_PIOA->PIO_PDR =  AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK;
  AT91C_BASE_PIOA->PIO_ASR =  AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK;
  AT91C_BASE_PIOA->PIO_BSR = 0;
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_SPI;

  /****  Fixed mode ****/
  AT91C_BASE_SPI->SPI_CR      = 0x81;              //SPI Enable, Sowtware reset
  AT91C_BASE_SPI->SPI_CR      = 0x01;              //SPI Enable


  //AT91C_BASE_SPI->SPI_MR      = 0xE0011;          //Master mode, fixed select, disable decoder, FDIV=0 (MCK), PCS=1110
  *AT91C_SPI_MR = AT91C_SPI_MODFDIS | AT91C_SPI_PS_FIXED | AT91C_SPI_MSTR | (0x0E<<16);
  AT91C_SPI_CSR[0] = AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(SPI_SCKDIV<<8);
}


Чтение /запись:
Код
unsigned char spiSendByte(const unsigned char data)
{
     // wait for transmit completion/ready
     while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE));
     // write data to be transmitted
     *AT91C_SPI_TDR = data;
     // wait for completion
     while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF));
     // return received data
     return *AT91C_SPI_RDR;

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tcom
сообщение Jun 26 2008, 08:12
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



Добавлю функции чтения буферов
Код
void Buffer_Read_Str (unsigned char BufferNo, unsigned int IntPageAdr, unsigned int No_of_bytes, unsigned char *BufferPtr)
{
    unsigned int i;
                                //make sure to toggle CS signal in order
    DF_CS_active;                        //to reset dataflash command decoder
    if (1 == BufferNo)                    //read byte(s) from buffer 1
    {
                DF_SPI_RW(Buf1Read);                //buffer 1 read op-code
        DF_SPI_RW(0x00);                //don't cares
        DF_SPI_RW((unsigned char)(IntPageAdr>>8));      //upper part of internal buffer address
        DF_SPI_RW((unsigned char)(IntPageAdr));            //lower part of internal buffer address
        DF_SPI_RW(0x00);                //don't cares
        for( i=0; i<No_of_bytes; i++)
        {
            *(BufferPtr) = DF_SPI_RW(0x00);        //read byte and put it in AVR buffer pointed to by *BufferPtr
            BufferPtr++;                //point to next element in AVR buffer
        }
    }
    else
    if (2 == BufferNo)                    //read byte(s) from buffer 2
    {
        DF_SPI_RW(Buf2Read);                //buffer 2 read op-code
        DF_SPI_RW(0x00);                //don't cares
        DF_SPI_RW((unsigned char)(IntPageAdr>>8));      //upper part of internal buffer address
        DF_SPI_RW((unsigned char)(IntPageAdr));            //lower part of internal buffer address
        DF_SPI_RW(0x00);                //don't cares
        for( i=0; i<No_of_bytes; i++)
        {
            *(BufferPtr) = DF_SPI_RW(0x00);        //read byte and put it in AVR buffer pointed to by *BufferPtr
            BufferPtr++;                //point to next element in AVR buffer
        }
    }
        DF_CS_inactive;    
}


Код
void Buffer_Write_Str (unsigned char BufferNo, unsigned int IntPageAdr, unsigned int No_of_bytes, unsigned char *BufferPtr)
{
    unsigned int i;
                                    //make sure to toggle CS signal in order
    DF_CS_active;                            //to reset dataflash command decoder
    if (1 == BufferNo)                        //write byte(s) to buffer 1
    {
        DF_SPI_RW(Buf1Write);                    //buffer 1 write op-code
        DF_SPI_RW(0x00);                    //don't cares
        DF_SPI_RW((unsigned char)(IntPageAdr>>8));              //upper part of internal buffer address
        DF_SPI_RW((unsigned char)(IntPageAdr));                    //lower part of internal buffer address
        for( i=0; i<No_of_bytes; i++)
        {
            DF_SPI_RW(*(BufferPtr));            //write byte pointed at by *BufferPtr to dataflash buffer 1 location
            BufferPtr++;                    //point to next element in AVR buffer
        }
    }
    else
    if (2 == BufferNo)                        //write byte(s) to buffer 2
    {
        DF_SPI_RW(Buf2Write);                    //buffer 2 write op-code
        DF_SPI_RW(0x00);                    //don't cares
        DF_SPI_RW((unsigned char)(IntPageAdr>>8));              //upper part of internal buffer address
        DF_SPI_RW((unsigned char)(IntPageAdr));                    //lower part of internal buffer address
        for( i=0; i<No_of_bytes; i++)
        {
            DF_SPI_RW(*(BufferPtr));            //write byte pointed at by *BufferPtr to dataflash buffer 2 location
            BufferPtr++;                    //point to next element in AVR buffer
        }
    }
        DF_CS_inactive;
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 21:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016