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.

[参考译文] SW-EK-TM4C123GXL:EK-TM4C123GXL + I2C + MAX30100传感器

Guru**** 2337880 points
Other Parts Discussed in Thread: EK-TM4C123GXL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/757080/sw-ek-tm4c123gxl-ek-tm4c123gxl-i2c-max30100-sensor

器件型号: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); //中断启用
} 

我仍然不处理这些值。 我只是尝试获取"毛值"和"红色"值、并在调试器中观察它们。

我不知道我犯了什么错误。 任何帮助都将不胜感激!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Chint可能、

    我看到您正在尝试在 I2C 中断处理程序中接收数据、但我看不到正在启用任何中断。 除非正确初始化 I2C 模块以使用中断、否则不会进入 ISR。

    请参考 TivaWare 中'examples/peripherals/i2c'文件夹下提供的 slave_receive_int.c 示例、了解如何初始化 I2C 中断的基本原理。 并确保已将 I2C0MasterIntHandler 包含在 I2C0的 STARTUP_CCS.c 文件中、因此它不会尝试使用默认 ISR 处理程序。