Полная версия этой страницы:
sam7s64 spi
Как передать 24 бита по SPI ? Руками управлять CS получается медленно. Если можно реализовать с помощью
задержки CS , то как? Спасибо.
aaarrr
Jan 15 2009, 12:54
Как 3 по 8, 2 по 12 и т.д. Уточните, в чем именно проблема? И причем тут задержка CS?
Передать 3 байта не проблема но CS дернется 3 раза. Нужно 24 бита при активном (низком) CS.
aaarrr
Jan 15 2009, 15:23
CSAAT не помогает? Изложите подробно, используется Fixed или Variable mode, задействован ли PDC. А еще лучше выложите код.
CODE
void init_spi(){
AT91C_BASE_PIOA->PIO_PDR =AT91C_PA11_NPCS0 | AT91C_PA12_MISO
| AT91C_PA13_MOSI | AT91C_PA14_SPCK;
AT91C_BASE_PIOA->PIO_PPUDR |= AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK;
AT91C_BASE_PIOA->PIO_ASR =AT91C_PA11_NPCS0 | AT91C_PA12_MISO
| AT91C_PA13_MOSI | AT91C_PA14_SPCK;
AT91C_BASE_PMC->PMC_PCER|=1<<AT91C_ID_SPI;
AT91C_BASE_SPI->SPI_CR |= AT91C_SPI_SPIDIS | AT91C_SPI_SWRST;
AT91C_BASE_SPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PS_FIXED;
//CPOL=1,PHASE=1,16 bit, SPCKHMhz/3 = 16Mhz
AT91C_BASE_SPI->SPI_CSR[0] = AT91C_SPI_CPOL
| AT91C_SPI_BITS_16 | (0x3<<8)&AT91C_SPI_SCBR;
// | AT91C_SPI_CSAAT;
AT91C_BASE_SPI->SPI_CR =AT91C_SPI_SPIEN;
};
unsigned int send_spi(unsigned int data)
{
// while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE));
while(!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY));
AT91C_BASE_SPI->SPI_TDR = data; //передача по SPI
while (!(AT91C_BASE_SPI -> SPI_SR & AT91C_SPI_RDRF));
return (AT91C_BASE_SPI->SPI_RDR);
};
Периферия фиксированная без PDC.
aaarrr
Jan 15 2009, 16:40
ИМХО, я бы для 24-х бит сделал так:
Код
void init_spi()
{
...
AT91C_BASE_SPI->SPI_CSR[0] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8 | (0x3<<8) | AT91C_SPI_CSAAT;
...
}
unsigned int send_spi(unsigned int data)
{
AT91C_BASE_SPI->SPI_TDR = data; //передача по SPI
while (!(AT91C_BASE_SPI -> SPI_SR & AT91C_SPI_RDRF));
return (AT91C_BASE_SPI->SPI_RDR);
}
int main(void)
{
...
send_spi(data0);
send_spi(data1);
send_spi(data2 | AT91C_SPI_LASTXFER);
...
}
Спасибо, этот код работает.
А вот это не совсем понятно, последняя строка:
• LASTXFER: Last Transfer
0 = No effect.
1 = The current NPCS will be deasserted after the character written in TD has been transferred. When CSAAT is set, this
allows to close the communication with the current serial peripheral by raising the corresponding NPCS line as soon as TD
transfer has completed.
This field is only used if Variable Peripheral Select is active (PS = 1).
У меня вроде фиксированная периферия.
aaarrr
Jan 15 2009, 19:26
М.б. они имели в виду, что этот бит будет недоступен в режиме fixed при использовании PDC. Если хотите, чтобы все было совсем честно, можете воспользоваться его копией в регистре SPI_CR, но это еще одна операция.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.