nRF52832開發之TWI淺析

nRF52832的TWI(two wire interface,也即是硬件i2c):

一、i2c通信知識儲備

1.i2c通信需要兩條線,sda和scl。I2C通信角色分爲:master和slave
2.當通信總線空閒時,scl、sda都處於高電平狀態
3.i2c通信過程中,有兩組控制信號:
1)start:
scl爲高電平時,sda由高電平變爲低電平
2)stop:
scl爲高電平時,sda由低電平變爲高電平

二、編程分析

sdk版本:nRF5_SDK_15.2.0_9412b96

//1.twi初始化配置
//頭文件:nrf_drv_twi.h
//sdk_config.h中開啓twi功能
#define ARDUINO_SCL_PIN 7
#define ARDUINO_SDA_PIN 8
#define TWI_IMU_INSTANCE_ID 1 //使用TWI1
#define IMU_ADDR (0x78>>1) //IMU地址
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_IMU_INSTANCE_ID) //twi實例
static volatile bool m_xfer_done = false; //指示twi的操作是否結束

//twi回調函數,主要是用來上報twi操作完成功能
static 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_TX)
			{
				NRF_LOG_INFO("twi tx donw!");
			}
			else if(p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX)
			{
				NRF_LOG_INFO("twi rx donw!");
			}
			m_xfer_done = true;
			break;
		case NRF_DRV_TWI_EVT_ADDRESS_NACK:
			NRF_LOG_INFO("Error event: NACK received after sending the address.");
			break;
		case NRF_DRV_TWI_EVT_DATA_NACK:
			NRF_LOG_INFO(" Error event: NACK received after sending a data byte.");
			break;
		default:
			break;
	}
}

static void twi_config(void)
{
	uint32_t err_code;
	nrf_drv_twi_config_t const config = {
	.scl = ARDUINO_SCL_PIN, //時鐘gpio引腳
	.sda = ARDUINO_SDA_PIN, //數據gpio引腳
	.frequency = NRF_TWI_FREQ_100K, //twi時鐘頻率
	.interrupt_priority = APP_IRQ_PRIORITY_LOWEST, //中斷優先級
	.clear_bus_init = false //初始化期間清除總線
	}
	//初始化twi
	err_code = nrf_drv_twi_init(&m_twi,&config,twi_handler,NULL);
	APP_ERROR_CHECK(err_code);
	//使能twi
	nrf_drv_twi_enable(&m_twi);
}

//2.讀寫從設備
1)寫
ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance,uint8_t address, uint8_t const *p_data,uint8_t length,bool no_stop);
p_instance:指向twi實例的指針
address:從設備地址
p_data:要發送的數據buffer
length:要發送的數據字節長度
no_stop:是否設置沒有停止位
2)讀
ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance,uint8_t address, uint8_t const *p_data,uint8_t length);
p_instance:指向twi實例的指針
address:從設備地址
p_data:讀取的數據存儲buffer
length:讀取的數據字節長度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章