Přeskočit na hlavní obsah

How To: SPI Bus

info

Tato kapitola popisuje, jak používat SDK modul TOWER SPI. Pokud si chcete přečíst o sběrnici samotné, přejděte na kapitolu SPI Interface.

Odkazy

Rychlost SPI

Můžete vybírat z několika komunikačních rychlostí.

info

Komunikační rychlost je omezena maximální rychlostí, kterou zvládne komunikovat podřízené zařízení, dále délkou vodičů, šumem, spotřebou proudu nebo limity elektromagnetického vyzařování.

TWR_SPI_SPEED_1_MHZ
TWR_SPI_SPEED_2_MHZ
TWR_SPI_SPEED_4_MHZ
TWR_SPI_SPEED_8_MHZ
TWR_SPI_SPEED_16_MHZ

Režim SPI

Polarita hodin a fáze hodin určují, kdy jsou výstupní data platná. Tedy zda na nástupné, nebo na spádové hraně.

Tuto informaci najdete v datasheetu podřízeného zařízení.

TWR_SPI_MODE_0 // SPI mode of operation is 0 (CPOL = 0, CPHA = 0)
TWR_SPI_MODE_1 // SPI mode of operation is 1 (CPOL = 0, CPHA = 1)
TWR_SPI_MODE_2 // SPI mode of operation is 2 (CPOL = 1, CPHA = 0)
TWR_SPI_MODE_3 // SPI mode of operation is 3 (CPOL = 1, CPHA = 1)

Příklady vysílání a příjmu dat

Synchronní přenos

info

Je potřeba vytvořit vysílací a přijímací buffer.

Poté spustíte blokující přenos a musíte počkat na jeho dokončení.

Příklad kódu synchronního přenosu SPI

uint8_t tx_buffer[2] = { 0x20, 0x00 };
uint8_t rx_buffer[2];

twr_spi_transfer(tx_buffer, rx_buffer, sizeof(rx_buffer));

note

Pokud data pouze vysíláte, nahraďte rx_buffer hodnotou NULL a naopak pro pouhý příjem.

Funkce vrací false, pokud předchozí asynchronní přenos ještě neskončil.

Asynchronní přenos

info

Jde o neblokující přenos, kdy je po dokončení přenosu vyvolána callback funkce.

Příklad kódu asynchronního přenosu SPI

// In async transmit the buffers must be global or
// in the function but defined as a static
uint8_t tx_buffer[2] = { 0x20, 0x00 };
uint8_t rx_buffer[2];

void send_data(void)
{
// Check if previous asynchronous transfer is not running
if (twr_spi_is_ready())
{
// Set event handler and optional parameter (NULL for now)
twr_spi_async_transfer(tx_buffer, rx_buffer, sizeof(tx_buffer), _twr_spi_event_handler, NULL)
}
}

void _twr_spi_event_handler(twr_spi_event_t event, void *event_param)
{
(void) event_param;

if (event == TWR_SPI_EVENT_DONE)
{
// Transfer done, you can for example handle received data or initiate a new transfer
}
}