请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:SW-EK-TM4C123GXL Thread 中讨论的其他器件:EK-TM4C123GXL
您好!
我正在尝试通过 I2C 向 EK-TM4C123GXL 获取 MAX 30100传感器的值。 我遇到了这样的问题:"我没有读取寄存器的权限" 、并指向 I2CSend 函数。 代码也无法到达 I2C 中断处理程序的位置。 以下是我编写的代码、
#include #include #include #include "inc/hw_i2c.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_gpio.h" #include "driverlib/i2c.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "drivermap/gpin/i2c.h" 全球 // int i; uint8_t FIFO_WR_PTR; uint8_t FIFO_RD_PTR; uint16_t Num_Samples_available; uint16_t Num_Samples_read; uint8_t IR1; uint8_t ir2; uint8_t red1; uint8_t red2; uint16_t ir; uint16_t RED; //********* 初始化 I2C 模块0 // void InitI2C0 (void) { //启用 I2C 模块0 SysCtlPeripheralEnable (SYSCTL_Periph_I2C0); //复位模块 SysCtlPeripheralReset (SYSCTL_Periph_I2C0); //启用包含 I2C 0的 GPIO 外设 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); //为端口 B2和 B3上的 I2C0功能配置引脚复用。 GPIOPinConfigure (GPIO_PB2_I2C0SCL); GPIOPinConfigure (GPIO_PB3_I2C0SDA); //为这些引脚选择 I2C 功能。 GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2); GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3); //启用和初始化 I2C0主机模块。 使用的系统时钟 // I2C0模块。 最后一个参数设置 I2C 数据传输速率。 //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为 //设置为400kbps。 I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true); //清除 I2C FIFO HWREG (I2C0_BASE + I2C_O_FIFOCTL)= 80008000; } //********* I2C 发送功能 // void I2CSend (uint16_t device_address、uint16_t device_register、uint8_t device_data) { //指定我们希望通过目标写入总线来与器件地址通信 I2CMasterSlaveAddrSet (I2C0_BASE、DEVICE_ADDRESS、FALSE); //要读取的寄存器 I2CMasterDataPut (I2C0_BASE、DEVICE_REGISTER); //将控制字节和寄存器地址字节发送到从器件 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START); //等待 MCU 完成事务 while (I2CMasterBusy (I2C0_BASE)); I2CMasterSlaveAddrSet (I2C0_BASE、DEVICE_ADDRESS、FALSE); //指定要写入上述 device_register 的数据 I2CMasterDataPut (I2C0_BASE、DEVICE_DATA); //在检查 MCU 以完成事务时等待 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_Receive_finish); //等待 MCU 和器件完成事务 while (I2CMasterBusy (I2C0_BASE)); } //********* I2C 单接收功能 // uint32_t I2CReceiveS (uint32_t slave_addr、uint8_t reg) { //指定我们正在向从器件写入(寄存器地址) I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、false); //指定要读取的寄存器 I2CMasterDataPut (I2C0_BASE、reg); //将控制字节和寄存器地址字节发送到从器件 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START); //等待 MCU 完成事务 while (I2CMasterBusy (I2C0_BASE)); //指定我们将从从从器件读取 I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、TRUE); //发送控制字节并从我们指定的寄存器中读取 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive); //等待 MCU 完成事务 while (I2CMasterBusy (I2C0_BASE)); //返回从指定寄存器提取的数据 返回 I2CMasterDataGet (I2C0_BASE); } //******** I2C 突发接收功能 // uint32_t I2CReceiveB (uint32_t slave_addr、uint8_t reg) { //指定我们正在向从器件写入(寄存器地址) I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、false); //指定要读取的寄存器 I2CMasterDataPut (I2C0_BASE、reg); //将控制字节和寄存器地址字节发送到从器件 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START); //等待 MCU 完成事务 while (I2CMasterBusy (I2C0_BASE)); //指定我们将从从从器件读取 I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、TRUE); //发送控制字节并从我们指定的寄存器中读取 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_Receive_start); //等待 MCU 完成事务 while (I2CMasterBusy (I2C0_BASE)); //返回从指定寄存器提取的数据 返回 I2CMasterDataGet (I2C0_BASE); } //******** 从 FIFO 复位功能 // void resetFifo () { I2CSend (0x57、0x02、0x00); //复位 FIFO 写入指针 I2CSend (0x57、0x04、0x00); //复位 FIFO 读取指针 I2CSend (0x57、0x03、0x00); //重置 FIFO 溢出计数 器} //********* I2C 中断处理程序函数 // void I2C0MasterIntHandler (void) { I2CMasterIntClear (I2C0_BASE); //清除 I2C 中断标志 Fifreseto(); //重置从 FIFO FIFO_WR_PTR = I2CReceiveS (0x57、0x02); //读取 FIFO 写入指针 num_samples_available = FIFO_WR_PTR - FIFO_RD_PTR; //评估要从 FIFO 读取的样本数 // Num_Samples_read =< Num_Samples_available; // 对于(i = 0;i < Num_Samples_available;i++) { IR1 = I2CReceiveB (0x57、0x05); //接收样本的第一个字节 IR2 = I2CReceiveB (0x57、0x05); //接收样本的第二个字节 IR =(uint16_t) IR1 << 16 |(uint16_t) ir2; //完成 IR 样本 REF1 = I2CReceiveB (0x57、0x05); //接收样本的第三个字节 RED2 = I2CReceiveB (0x57、0x05); //接收样本的第四个字节 红色=(uint16_t) red1 << 16 |(uint16_t) red2; //完成红色样本 } } //********* 主要内容 // int main() { SysCtlClockSet (SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_INT | SYSCTL_XTAL_16MHz); //系统时钟 InitI2C0(); // I2C 初始化 Fifreseto(); //重置从 FIFO I2CSend (0x57、0x06、0x03); //模式配置 I2CSend (0x57、0x07、0x47); // SpO2配置 I2CSend (0x57、0x09、0x44); // LED 配置 I2CSend (0x57、0x00、0xB1); //中断状态 I2CSend (0x57、0x01、0xB0); //中断启用 }
我仍然不处理这些值。 我只是尝试获取"毛值"和"红色"值、并在调试器中观察它们。
我不知道我犯了什么错误。 任何帮助都将不胜感激!!