nrf52832通过i2c官方库nrf_drv_twi读取tmp117温度

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, &reg_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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值