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.

[参考译文] EK-TM4C123GXL:I2C 接口不会触发!!

Guru**** 2609285 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/757092/ek-tm4c123gxl-i2c-interface-not-firing-up

器件型号:EK-TM4C123GXL

您好!

我的 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 "driverlib/pin_map.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 redd1;

 uint8_t red2;

 uint16_t ir;

 uint16_t RED;

//*********  初始化 I2C 模块0  //

 空 InitI2C0 (空)

  //启用 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 (空 Fifreset

  I2CSend (0x57、0x02、0x00);                        //复位 FIFO 写入指针

  I2CSend (0x57、0x04、0x00);                        //复位 FIFO 读取指针

  I2CSend (0x57、0x03、0x00);                        //重置 FIFO 溢出计数器

//*********  I2C 中断处理程序函数  //

空 I2C0MasterIntHandler (空)

  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可能、

    这似乎是您之前发布的重复主题、请每个主题仅保留一个主题。 我们将在以下主题中回答您的问题: e2e.ti.com/.../757080