Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sam7s64 spi
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
vald
Как передать 24 бита по SPI ? Руками управлять CS получается медленно. Если можно реализовать с помощью
задержки CS , то как? Спасибо.
aaarrr
Как 3 по 8, 2 по 12 и т.д. Уточните, в чем именно проблема? И причем тут задержка CS?
vald
Передать 3 байта не проблема но CS дернется 3 раза. Нужно 24 бита при активном (низком) CS.
aaarrr
CSAAT не помогает? Изложите подробно, используется Fixed или Variable mode, задействован ли PDC. А еще лучше выложите код.
vald
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
ИМХО, я бы для 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);
    ...
}
vald
Спасибо, этот код работает.
А вот это не совсем понятно, последняя строка:
• 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
М.б. они имели в виду, что этот бит будет недоступен в режиме fixed при использовании PDC. Если хотите, чтобы все было совсем честно, можете воспользоваться его копией в регистре SPI_CR, но это еще одна операция.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.