【CT7117A】数字温度传感器及驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

MCU使用的是NRF52832,I²C总线上挂载CT7117A数字温度传感器
官网链接:http://www.sensylink.com/a/poducts/lm1/CT7117.html


一、芯片手册

关键参数
CT7117A芯片手册标称,精度最高可达0.1℃(-20℃~80℃),温度覆盖人体体温、可穿戴设备的绝大部分使用场景。
在这里插入图片描述
温度量程
-50℃ ~ 150℃
在这里插入图片描述
电路设计参考
在这里插入图片描述
名称定义
在这里插入图片描述

二、驱动

1. I²C驱动

代码如下(示例):

#define TWI_INSTANCE_ID     1

static volatile bool m_xfer_done = false;
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

void twi_master_init(void)
{
    uint32_t err_code;

    const nrf_drv_twi_config_t twi_config = {
       .scl                = 1,  
       .sda                = 0,  
       .frequency          = NRF_DRV_TWI_FREQ_100K, 
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH, 
       .clear_bus_init     = false
    };

    err_code = nrf_drv_twi_init(&m_twi, &twi_config, twi_handler, NULL);
    APP_ERROR_CHECK(err_code);
    nrf_drv_twi_enable(&m_twi);
}

void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
	switch (p_event->type)
    {
		case NRF_DRV_TWI_EVT_DONE:
			m_xfer_done = true;
			break;

		case NRF_DRV_TWI_EVT_ADDRESS_NACK:
			SEGGER_RTT_printf(0, "NRF_DRV_TWI_EVT_ADDRESS_NACK\r\n");
			break;

		case NRF_DRV_TWI_EVT_DATA_NACK:
			SEGGER_RTT_printf(0, "NRF_DRV_TWI_EVT_DATA_NACK\r\n");
			break;

		default:
			break;
    }
}


bool i2c_register_write(uint8_t register_address, uint8_t value)
{
	uint32_t err_code;
	uint8_t tx_buf[2];

	tx_buf[0] = register_address;
	tx_buf[1] = value;

	m_xfer_done = false;

	err_code = nrf_drv_twi_tx(&m_twi, CT7117A_SLAVE_ADDR, tx_buf, 2, false);

	while (m_xfer_done == false){}
	if (NRF_SUCCESS != err_code)
	{
		return false;
	}
	return true;	
}

bool i2c_register_read(uint8_t register_address, uint8_t * destination, uint8_t number_of_bytes)
{
	uint32_t err_code;
	
	m_xfer_done = false;
	err_code = nrf_drv_twi_tx(&m_twi, CT7117A_SLAVE_ADDR, &register_address, 1, true);

	while (m_xfer_done == false){}
	if (NRF_SUCCESS != err_code)
	{
		return false;
	}

	m_xfer_done = false;
	err_code = nrf_drv_twi_rx(&m_twi, CT7117A_SLAVE_ADDR, destination, number_of_bytes);

	while (m_xfer_done == false){}
	if (NRF_SUCCESS != err_code)
	{
		return false;
	}

	return true;
}

2.读取温度

代码如下(示例):

#define CT7117A_TEMP				0X00
#define CT7117A_CONFIG				0X01
#define CT7117A_LOW_TEMP_SET		0X02
#define CT7117A_HIGH_TEMP_SET		0X03
#define CT7117A_MANU_ID_ADDR		0X07

#define CT7117A_SLAVE_ADDR			0x48	
#define CT7117A_DEVICE_ID           0X59 	

/**
 ******************************************************************************
 * @brief	CT7117A_Read_ID
 ******************************************************************************
 */
void CT7117A_Read_ID(void)
{
	uint8_t whoAmI;
	i2c_register_read(CT7117A_MANU_ID_ADDR, &whoAmI, sizeof(whoAmI));
	// SEGGER_RTT_printf(0, "CT7117A[Device Id] -> 0x%02x\r\n", whoAmI);
	if(whoAmI != CT7117A_DEVICE_ID)
	{
		SEGGER_RTT_printf(0, "ID error!\r\n");
		return;
	}
}

/**
 ******************************************************************************
 * @brief	CT7117A_Get_temperature
 ******************************************************************************
 */
float CT7117A_Get_temperature(void)
{
	uint8_t temp[2];
	uint16_t ret;
	float tt;

	i2c_register_read(CT7117A_TEMP, temp, 2);
	// SEGGER_RTT_printf(0, "[%d] [%d]\r\n", temp[0], temp[1]);
	ret = (temp[0] << 8) | (temp[1]);
	tt = (ret * 100.00 / 12800.00);  //From datasheet

	return tt;
}


总结

I²C器件通讯地址都是7位,最后一位是读写位,由MCU底层驱动操控(移位)读则为0,写则为1。
但是有的时候芯片手册中标注的都是完整的所谓的“8位地址”,在写驱动的时候需要牢记,不要被误导。

能力有限,研究不深;
有问题欢迎留言讨论!
个人邮箱:imxyp9x@163.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值