twi调试过程如下:
1 代码实现:分别实现对nrf_drv_twi_init,nrf_drv_twi_rx, nrf_drv_twi_tx相关官方库的调用
2 修改工程配置文件sdk_config.h, 增加TWI的相关配置,参考\nRF5_SDK_17.0.2_d674dde\nRF5_SDK_17.0.2_d674dde\examples\peripheral\twi_sensor 实现
main.c
int main(void)
{
tmp117_init();
for (;; )
{
if (tmp117_in_degree_c() == true)
nrf_delay_ms(1000);//延时1s方便观察数据
idle_state_handle();
}
}
tmp117.c
#define TWI_SCL_PIN 25//6
#define TWI_SDA_PIN 27//20
#define TMP117_ADDR (0x90U >> 1) //0x48 << 1; // Use 8-bit address
#define TMP117_REG_DEVICE_ID 0x0F
uint8_t REG_TEMP = 0x00;
//TWI驱动程序实例ID,ID和外设编号对应,0:TWI0 1:TWI1
#define INSTANCE_ID 0
//TWI传输完成标志,设置m_xfer_done 全局变量,发送/接收是否完成
static volatile bool m_xfer_done = false;
//定义TWI驱动程序实例,名称为m_twi
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(INSTANCE_ID);
//TWI事件回调处理函数
void twi_handler(nrf_drv_twi_evt_t const *p_event, void *p_context)
{
switch (p_event->type)
{
//传输完成事件
case NRFX_TWI_EVT_DONE:
m_xfer_done = true;//置位传输完成标志
break;
default:
break;
}
}
//TWI初始化
void tmp117_init(void)
{
ret_code_t err_code;
//定义并初始化TWI配置结构体
const nrf_drv_twi_config_t twi_config =
{
.scl = TWI_SCL_PIN,
.sda = TWI_SDA_PIN,
.frequency = NRF_DRV_TWI_FREQ_100K,
.interrupt_priority = APP_IRQ_PRIORITY_HIGH,
// .hold_bus_uninit = NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT,
.clear_bus_init = false//初始化期间不发送9个SCL时钟
};
//初始化TWI
err_code = nrf_drv_twi_init(&m_twi, &twi_config, twi_handler, NULL);
//检查返回的错误代码
APP_ERROR_CHECK(err_code);
//使能TWI
nrf_drv_twi_enable(&m_twi);
}
/*************************************************************************
* 功 能 : 读寄存器
* 参 数 : register_address[in]:如温度寄存器地址
* : * destination[out] :指向保存读取数据的缓存
* : number_of_bytes[in] :读取的数据长度
* 返回值 : true:操作成功,false:操作失败
*************************************************************************/
bool tmp117_reg_read(uint8_t reg_address, uint8_t *destination, uint8_t number_of_bytes)
{
ret_code_t err_code;
//TWI传输完成标志设置为false
m_xfer_done = false;
err_code = nrf_drv_twi_tx(&m_twi, TMP117_ADDR, ®_address, 1, true);
//等待TWI总线传输完成
while (m_xfer_done == false){nrf_pwr_mgmt_run();}
if (NRF_SUCCESS != err_code){return false;}
//TWI传输完成标志设置为false
m_xfer_done = false;
err_code = nrf_drv_twi_rx(&m_twi, TMP117_ADDR, destination, number_of_bytes);
//等待TWI总线传输完成
while (m_xfer_done == false){}
if (NRF_SUCCESS != err_code){return false;}
return true;
}
bool tmp117_in_degree_c(void)
{
uint8_t buffer[2];
int16_t val;
bool ret = false;
static float temperature = 0;
if (tmp117_reg_read(REG_TEMP, buffer,2) == false){ret = false;}
if (tmp117_reg_read(REG_TEMP, buffer,2) == true) /* R: Temperature Register */
{
val = (buffer[0] << 8) | buffer[1];
temperature = (val * 0.0078125); //0.0078125 is the resolution refer to TMP117 datasheet page 11
//LOG打印float数值
NRF_LOG_INFO("tempature: " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(temperature));
NRF_LOG_FLUSH();
ret = true;
}
return ret;
}