vald 0 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба Как передать 24 бита по SPI ? Руками управлять CS получается медленно. Если можно реализовать с помощью задержки CS , то как? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба Как 3 по 8, 2 по 12 и т.д. Уточните, в чем именно проблема? И причем тут задержка CS? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vald 0 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба Передать 3 байта не проблема но CS дернется 3 раза. Нужно 24 бита при активном (низком) CS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба CSAAT не помогает? Изложите подробно, используется Fixed или Variable mode, задействован ли PDC. А еще лучше выложите код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vald 0 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба 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 69 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба ИМХО, я бы для 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 0 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба Спасибо, этот код работает. А вот это не совсем понятно, последняя строка: • 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 69 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба М.б. они имели в виду, что этот бит будет недоступен в режиме fixed при использовании PDC. Если хотите, чтобы все было совсем честно, можете воспользоваться его копией в регистре SPI_CR, но это еще одна операция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться