主题中讨论的其他器件: TMP100
工具/软件:Code Composer Studio
我将 TM4C1294NCPDT 与 Code Composer Studio 结合使用。
我想从基于 I2C 的传感器读取数据。
在库中的 i2c.c 文件中有许多函数。
读取 i2c 传感器的数据时应使用哪些函数?
我想执行一个简单的读取操作。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我将 TM4C1294NCPDT 与 Code Composer Studio 结合使用。
我想从基于 I2C 的传感器读取数据。
在库中的 i2c.c 文件中有许多函数。
读取 i2c 传感器的数据时应使用哪些函数?
我想执行一个简单的读取操作。
[引用 user="m_vedsharma"]
读取 i2c 传感器的数据时应使用哪些函数?
我想执行一个简单的读取操作。 [/报价]
正如您列出的"I2C 传感器"一样、任何这样的"传感器读取"都很可能证明"远不简单"。
此类传感器通常提供多种操作模式-以及可能"多"字节的数据-这些模式会泄露"简单"-这难道不是吗?
"简单"正如您所列出的-最好通过选择(而不是)基于 I2C 的小容量 EEPROM 来获得、该 EEPROM 实际上可能符合"简单"的要求。
该供应商提供了示例代码、其中详细介绍了如何实现此类 EEPROM 的"读取"。 (EEPROM 很小、价格低廉且"简单"。)
KISS 规定、在选择(未指定) I2C 传感器时、"学习和实验"开始较小且受到控制(可能违反)。
MCU 的手册和外设驱动程序库用户手册"深入"介绍了 I2C 操作-您还没有注意到您对 I2C 操作的熟悉程度-此类阅读/评论"一定要提供指导/帮助"。
下面是读取 DK-TM4C129X 开发板上的 TMP100温度传感器的示例程序。 它基于最初来自此线程的代码: e2e.ti.com/.../2158708
#include #include #include "inc/hw_i2c.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/i2c.h" #include "driverlib/interrupt.h" #include "drivermap_intrunion.h"#define "#include "driverlib_rom_int_rom_intrl"#define "#define "#define "#t_ine_intrunion.tag.try"#define "#include "#define "driver8_int_ine_inu.tot_it_inu.tot_it_inc.h"#define #define "driverlib_intry"#include "driver uint8_t HIGH; }u8; }; 静态浮点温度; int main () { union temp_tag temp; uint32_t sys_clock、error; sys_clock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); SysCtlPeripheralEnable (SYSCTL_Periph_I2C6); while (!(SysCtlPeripheralReady (SYSCCtl_Periph_I2C6)) ){ }SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); while (SYSCIPBLE_GPIO6_GPIO6_GPIO6) (GPIPB_GPIO6_GPIO6_GPIO6_GPIOB_GPIOB_GPIOB_PHIN); GPIO_PIN_7); I2CMasterInitExpClk (I2C6_BASE、SYS_CLOCK、false);// False = 100KHz while (1) { I2CMastereAddrSet (I2C6_BASE、SLAVE_ADDRESS、FALSE); //配置寄存器*/ I2CMasterDataPut (I2C6_SIDRK、I2C6_START );0xC6_SIT_START (I2CMC6 SIT_SIT_START); while (I2CMasterBusy (I2C6_BASE)); error = I2CMasterErr (I2C6_BASE); if (I2CMasterErr (I2C6_BASE)!= I2C_MASTER_ERR_NONE) { I2CMasterIntClear (I2C6_BASE);//清除任何发生的中断。 返回错误; } I2CMasterDataPut (I2C6_BASE、0xA1); I2CMasterControl (I2C6_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH); MAP_SysCtlDelay (100); while (I2CMasterBusy (I2C6_BASE); I2CMasterSlaveAddrSet (I2C6_BASE、SLAVE_ADDRESS、FALSE); I2CMasterDataPut (I2C6_BASE、0x00); //P1 P0 = 01 =配置寄存器 字节进入 PR I2CMasterControl (I2C6_BASE、I2C_MASTER_CMD_BURST_SEND_START); MAP_SysCtlDelay (100); while (I2CMasterBusy (I2C6_BASE)); I2CMasterSlaveAddrSet (I2C6_BASE、 SLAVE_ADDRESS、TRUE);// TRUE 表示主器件正在发起接收。 I2CMasterControl (I2C6_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START); MAP_SysCtlDelay (300); while (I2CMasterBusy (I2C6_BASE)); temp.u8.high = I2CMasterDataGet (I2C6_BASE); I2CMasterControl (I2C6_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH); MAP_SysCtlDelay (300); while (I2CMasterBusy (I2C6_BASE)); temp.u8.low = I2CMasterDataGet (I2C6_BASE); 温度=(temp.i16>6)* 0.25; //温度现在保持温度的浮点值,单位为摄氏度 }