提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
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, ®ister_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