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-TM4C1294XL:LM75A 传感器 I2C 通信存在问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/754578/ek-tm4c1294xl-problem-with-lm75a-sensor-i2c-comminication

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:LM75A

您好;

我们的目标是使用 LM75A 传感器来测量温度。 我们无法在传感器和控制器卡之间进行 i2c 通信。 主要问题是我们无法构建 i2c 引脚。 我们遵循有关我们的卡的 Tiva c 系列的说明。 当我们在示波器上观察时,我们看不到 SCL 线路上的时钟波形。  

从机地址为0x00。 我们将传感器地址引脚接地。  

#include 
#include 
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.inc"
#tx4minc"


#define SLAVE_ADDRESS 0x00


void setup (){
Serial.begin(9600);
Serial.print ("asd0");
GPIOPinConfigure (GPIO_PK6_I2C4SCL);
GPIOPinConfigure (GPIO_PK7_I2C4SDA);


GPIOPinTypeI2C (GPIO_PORTK_base、(1 << 7)); //配置 SDA
GPIOPinTypeI2CSCL (GPIO_PORTK_base、(1 << 6));//配置 SCL

serial.print ("test1");
I2CMasterInitExpClk (I2C4_base、g_ui32SysClock、false);

I2CSlaveEnable (I2C4_base);
serial.print ("test2");
I2CSlaveInit (I2C4_base、slave_address);
I2CMasterSlaveAddrSet (I2C4_base、slave_address、false);
serial.print ("test3");

} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、SDA 和 SCL 上是否都有上拉电阻器? 其次,我看到您将 I2C4配置为主器件,但我看不到对"I2CMasterDataPut()的调用。 这是在代码的不同部分吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #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.h"
    
    #include "driverlib/interrupt.h"
    /**
    * main.c
    *//
    
    
    /#define SLAVE_ADDRESS 0x3C
    
    
    int main (void)
    {
    
    volatile uint32_t result;
    int ui32SysClock;
    //启用 GPIO 以配置 I2C 接口引脚
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
    
    //等待外设为编程做好准备
    
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOL)
    ||!SysCtlPeripheralReady (SYSCTL_Periph_GPIOK);
    
    //为 I2C2主接口配置引脚
    
    GPIOPinConfigure (GPIO_PL1_I2C2SCL);
    GPIOPinConfigure (GPIO_PL0_I2C2SDA);
    GPIOPinTypeI2C (GPIO_PORTL_BASE、GPIO_PIN_0);
    GPIOPinTypeI2CSCL (GPIO_PORTL_BASE、GPIO_PIN_1);
    
    //为 I2C3从接口配置引脚
    
    GPIOPinConfigure (GPIO_PK4_I2C3SCL);
    GPIOPinConfigure (GPIO_PK5_I2C3SDA);
    GPIOPinTypeI2C (GPIO_PORTK_base、GPIO_PIN_5);
    GPIOPinTypeI2CSCL (GPIO_PORTL_BASE、GPIO_PIN_4);
    
    I2CMasterInitExpClk (I2C2_base、SysCtlClockGet ()、false);
    
    ////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    
    ////////////////////////////////////////////////////////////////////////////
    
    
    //针对120MHz
    
    ui32SysClock 的设置系统时钟= SysCtlClockFreqSet ((SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_XTAL_25MHz | SYSCTL_CFG_VCO_480
    )、120000000);
    
    //停止时钟、复位和 SysI2C 模块
    //在准备
    
    
    
    
    
    
    
    好编程时启用 SYSCBLE_PERipt2 (SYSCBLE_PERIP2);SYSCBLE_PERIP2 (SYSCBLE_PERIP2);SYSCBLE_PERIP2 (SYSCTL_C2)
    
    //初始化和配置主模块
    
    I2CMasterInitExpClk (I2C2_base、ui32SysClock、false);
    
    //为仲裁丢失、停止、NAK、时钟低电平启用中断
    //超时和数据。
    
    I2CMasterIntEnableEx (I2C2_base、(I2C_MASTER_INT_ARB_Lost |
    I2C_MASTER_INT_STOP | I2C_MASTER_INT_NACK |
    I2C_MASTER_INT_TIMEOUT | I2C_MASTER_INT_DATA);
    
    //从 I2C 主机
    
    内部启用(INT_I2C2)在 NVIC 中启用中断;
    
    #define I2C_YEST_INT_RELEASE 地址#0x255
    
    
    I2CMasterSlaveAddrSet (I2C2_base、slave_address_EXT、false);
    
    
    
    
    while (1)
    {
    
    
    I2CMasterDataPut (I2C2_base、0x33);
    I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_SEND);
    
    //等待从机接收并确认数据。
    
    while (!(I2CSlaveStatus (I2C3_base)& I2C_SLAVE_ACT_RREQ));
    
    //从从从器件读取数据。
    
    结果= I2CSlaveDataGet (I2C3_base);
    
    //等待主机模块完成传输。
    
    while (I2CMasterBusy (I2C3_base));
    
    
    }
    
    
    
    返回0;
    
    }
    

    我的所有代码都在这里。 我使用您的建议,但仍然不起作用。 我是否有任何您发现或需要做的错误?