Jak na: Sběrnice SPI
Tato kapitola popisuje, jak používat modul SDK pro SPI. O samotné sběrnici se dočtete v kapitole Rozhraní SPI.
Odkazy
- Modul SDK pro SPI
- Příklad v repozitáři na GitHubu
Rychlost SPI
Můžete vybírat z několika komunikačních rychlostí.
Rychlost komunikace omezuje maximální rychlost podřízeného zařízení, délka vodičů, šum, odběr 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 a fáze hodinového signálu určují, kdy jsou výstupní data platná, tedy jestli na náběžné, nebo sestupné hraně.
Tuto informaci najdete v dokumentaci (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
Je potřeba vytvořit vysílací a přijímací buffer.
Pak spustíte blokující přenos a počkáte, až skončí.
Příklad kódu: synchronní přenos SPI
uint8_t tx_buffer[2] = { 0x20, 0x00 };
uint8_t rx_buffer[2];
twr_spi_transfer(tx_buffer, rx_buffer, sizeof(rx_buffer));
Pokud data jen vysíláte, nahraďte rx_buffer hodnotou NULL; při pouhém příjmu naopak.
Funkce vrací false, pokud předchozí asynchronní přenos ještě neskončil.
Asynchronní přenos
Jde o neblokující přenos: po jeho dokončení se zavolá funkce callback.
Příklad kódu: asynchronní přenos 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
}
}