Nordic nRF5 SDK 學習筆記之四, TWI (I2C) 匯流排
硬體: nRF52832
SDK: Ver 15.2.0
目標: TWI (I2C) 匯流排應用 (TWI MASTER 模式)
樣例: <InstallFolder>\examples\peripheral\twi_sensor
TWI driver 包括兩層: HAL 硬體層和 DRV 驅動層;
TWI MASTER 於 sdk_config.h 中配置
注意:配置中下圖紅框中 TWI0_ENABLED 使能! 以及選中 TWI0_USE_EASY_DMA!
TWI 初始化
初始化和使能函式: nrf_drv_twi_init
去除初始化和禁止函式: nrf_drv_twi_disable(), nrf_drv_twi_uninit()
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context) { switch (p_event->type) { case NRF_DRV_TWI_EVT_DONE: if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX) { data_handler(m_sample); } m_xfer_done = true; break; default: break; } } void twi_init (void) { ret_code_t err_code; const nrf_drv_twi_config_t twi_config = { .scl = ARDUINO_SCL_PIN, .sda = ARDUINO_SDA_PIN, .frequency = NRF_DRV_TWI_FREQ_100K, .interrupt_priority = APP_IRQ_PRIORITY_HIGH, .clear_bus_init = false }; err_code = nrf_drv_twi_init(&m_twi_0, &twi_config, twi_handler, NULL); APP_ERROR_CHECK(err_code); nrf_drv_twi_enable(&m_twi_0); }
基本用法, 阻塞模式 (blocking mode)
此模式下,不使用中斷,沒有上下文控制代碼;
功能函式 nrf_drv_twi_rx(), nrf_drv_twi_tx() 在請求傳輸完成後,或出錯就會返回。
// 阻塞模式示例程式碼 uint32_t err_code; uint8_t tx_data[] = {'a', 'b', 'c', 'd', 'e'}; const nrf_drv_twi_t twi = NRF_DRV_TWI_INSTANCE(0); err_code = nrf_drv_twi_init(&twi, NULL, NULL); APP_ERROR_CHECK(err_code); nrf_drv_twi_enable(&twi); err_code = nrf_drv_twi_tx(&twi, SLAVE_ADDRESS, tx_data, sizeof(tx_data), false); APP_ERROR_CHECK(err_code);
高階用法,非阻塞模式 (non-blocking mode)
TWI 中斷會呼叫對應的事件處理
功能函式 nrf_drv_twi_tx(), nrf_drv_twi_rx(), nrf_drv_twi_xfer() 執行後會立即返回 NRF_SUCCESS,
或是當驅動忙時, 立即返回 NRF_ERROR_BUSY
此模式下, 可用 nrf_drv_twi_xfer() 進行復雜引數傳輸,使用 nrf_drv_twi_xfer_desc_t 結構體;
注: TWI 僅支援 NRF_DRV_TWI_FLAG_TX_NO_STOP flag. 其它標識需要 TWIM.
nrf_drv_twi_xfer_desc_t::type 定義了傳輸型別
Starting a transfer from PPI (暫略)
Repeated transfers (暫略)
Events (暫略)
在專案檔案結構中,新增 nrf_dev_twi.c, nrfx_twi.c,nrfx_twim.c