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:连接 L3G4200d

Guru**** 2322270 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/584453/ek-tm4c123gxl-interfacing-of-l3g4200d

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123TM4C123GH6PM

大家好、我正在尝试通过 I2C 协议将 L3g4200d 与 tm4c123连接、但无法读取任何数据。 我正在使用 Keil 5。 所有6个寄存器输出 FF、与陀螺仪模块的任何方向无关。请帮我 一个新手。

#include
#include
#include
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/tm4c123gh6m.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.c"
#include "driverlib/uart.c"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "inc/hw_i2c.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/rom.h"
#include "utils/uartstdio.c"
#include "driverlib/gyro.h"
volatile int x=1、a=1、y=1、z=1、b=1、c=1;


空配置 UART (空)

//
//启用 UART 使用的 GPIO 外设。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

//
//启用 UART0
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

//
//为 UART 模式配置 GPIO 引脚。
//
ROM_GPIOPinConfigure (GPIO_PA0_U0RX);
ROM_GPIOPinConfigure (GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

//
//使用内部16MHz 振荡器作为 UART 时钟源。
//
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);

//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、16000000);
UARTprintf ("UART 初始化...");


空配置 I2C()


ROM_SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_6);
ROM_GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_7);

ROM_GPIOPinConfigure (GPIO_PA6_I2C1SCL);
ROM_GPIOPinConfigure (GPIO_PA7_I2C1SDA);
I2CMasterInitExpClk (I2C1_base、SysCtlClockGet ()、false);
/* SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
//清除 I2C FIFO
HWREG (I2C0_BASE + I2C_O_FIFOCTL)= 80008000;*/


INT I2CReceive (int slave_addr、int reg)

I2CMasterSlaveAddrSet (I2C1_base、slave_addr、false);
I2CMasterDataPut (I2C1_base、reg);
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);
while (I2CMasterBusy (I2C1_base)) a++;
I2CMasterSlaveAddrSet (I2C1_base、slave_addr、true);
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_Receive);
while (I2CMasterBusy (I2C1_base)) b++;
a=1;b=1;
volatile int r=I2CMasterDataGet (I2C1_base);
返回 r;


int main()
{SysCtlClockSet (SYSCTL_SYSDIV_1| SYSCTL_USE_PLL | SYSCTL_OSC_INT | SYSCTL_XTAL_16MHz);
volatile int freq=SysCtlClockGet ();

volatile int xl、yl、zl、xh、yh、zh;

ConfigureUART();
ConfigureI2C();


while (1)
{XL=I2CReceive (slave_address、out_X_L);xh=I2CReceive (slave_address、out_X_H);
yL=I2CReceive (slave_address、out_Y_L);yh=I2CReceive (slave_address、out_Y_H);
ZL=I2CReceive(从器件地址,OUT_Z_L);Zh=I2CReceive(从器件地址,OUT_Z_H);

x=(xh<<8)|XL;UARTprintf ("x=%d\t"、x);
y=(yH<<8)|yl;UARTprintf ("y=%d\t"、y);
z=(zh<<8)|zl;UARTprintf ("z=%d\n"、z);




返回0;

 

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

    我认为您缺少对 GPIOPinTypeI2CSCL 和 GPIOPinTypeI2C 第10行和第11行的调用、示例如下:

    void ConfigureI2C()
    {
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_6);
    ROM_GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_7);
    
    ROM_GPIOPinConfigure (GPIO_PA6_I2C1SCL);
    ROM_GPIOPinConfigure (GPIO_PA7_I2C1SDA);
    GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_6);
    GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_7);
    I2CMasterInitExpClk (I2C1_base、SysCtlClockGet ()、false);
    }
    

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

    尊敬的 Bob:

    感谢你的答复。

    但我不明白为什么你重复第10行和第11行中的第5行和第6行。

    此致、

    Ankit Kumar。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哎呀! 我的错误。 昨天我必须一直盯着太多的代码、错过了第5行和第6行。

    您是否已仔细检查"slave_address"的值? 如果引脚4连接到低电平、则应为0x68;如果引脚4连接到高电平、则应为0x69。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    我已将从器件引脚4连接到低电平并将其寻址为0x68。

    此致、

    Ankit Kumar。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否看过 SCL 和 SDA 线以及示波器、以查看 TM4C 是否正在传输正确的命令?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请注意、Fire/I 使用 Stellaris V9453。   (因为这是最后一个:我认为稳定、已知(完全)良好的 API。)

    查看您的代码,我注意到它使用参数“I2C1_base”,而我们的(工作代码)使用:“I2C1_MASTER_BASE ”***-我们的代码在(过去) Stellaris 下运行!  ***

    这种代码差异会跳出来-尽管它可能是从 StellarisWare 迁移(仍在进行中)到(新) Tiva 版本的结果。   我怀疑您"需要"参数-正如我列出的-尽管如果该参数被识别为非法、则应该会出现错误。

    请注意,在调用"rom_I2CMasterDataPut()之前,我们(始终)立即调用"rom_I2CMasterControl()"。   您的代码(有时)忽略了对"Rom_I2CMasterDataPut ()"的调用。  在(较旧版本) StellarisWare 下-"Put"函数"未"将其数据传播到 I2C 引脚、而没有(以下)调用"MasterControl!"   (您的范围可以-并且将-确认此要求...)  这很好地解释了您的(现有)代码的失败...

    我注意到您在 I2C0和 I2C1之间的代码列表是不同的-序列和包含都是不同的。  明智吗?   我们更喜欢"复制/粘贴"、但仅更改是目标 I2C 模块。  (可能还有 I2C 外设要求的任何其他更改)  独特的代码列表会使问题复杂化-可能揭示了匆忙/缺乏纪律。

    您会报告接收到"0xFF"、这表示上拉 Rs "有效/良好"。   此类 Rs 必须出现在您使用的每个 I2C 端口上-我们始终选择外部(低于10K)器件-而不是 MCU 中驻留(内部)的"过高"值。   过高的 R 值会导致信号反射、圆角边-这种情况往往会"困扰"I2C 操作!

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

     您好、先生、

     您能解释一下"SCL 和 SDA 线与示波器"的含义吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我建议您使用示波器来探测 TM4C123器件的 I2CSCL 和 I2CSDA 输出、以确定问题是由 EK-TM4C123GXL 发送 I2C 命令引起的、还是由响应命令的 L3G4200d 解决的。 可以在 EK-TM4C123GXL 上找到这些信号。 PA6_I2C1SCL 位于 J1-9上、PA7_I2C1SDA 位于 J1-10上。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    命令"I2C1_MASTER_BASE"给出了错误、因此我将其改回  "I2C1_BASE"。 我在示波器上检查了引脚 SCL 和 SDA 线路的输出、这就是我得到的结果。

    此致、

    Ankit Kumar。

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

    好的、现在 看起来您已成功配置 TM4C123以输出 I2C 信号。 我建议您现在验证 L3G4200d 是否已正确通电、配置是否正确 并正确连接到 TM4C123。 由于 L3G4200d 不是 TI 器件、因此您可能需要通过 ST 获取有关该器件的帮助。

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

    [引用 user="CB1_mobile "]请注意,在调用"rom_I2CMasterDataPut ()"之前,我们(始终)调用"rom_I2CMasterControl()。"[/quot]

    我站在(上面)的海报(失败)代码列表中(仍然)是"可能可疑"。   (几次 出现"rom_I2CMasterControl()"时,前面有"put ()"。)  至少、在 StellarisWare 下、这两个函数(大多数都是)是配对的、并且"背靠背"。

    似乎为了适应更高速度的 I2C、TivaWare 已经进行了更改-这说明了"I2Cx_Master_Base"参数的"释放/淘汰"。

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

    您好 CB1、

    [引用 user="Ankit Kumar"]int I2CReceive(int slave_addr、int reg)

    I2CMasterSlaveAddrSet (I2C1_base、slave_addr、false);
    I2CMasterDataPut (I2C1_base、reg);
    I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);
    while (I2CMasterBusy (I2C1_base)) a++;
    I2CMasterSlaveAddrSet (I2C1_base、slave_addr、true);
    I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_Receive);
    while (I2CMasterBusy (I2C1_base)) b++;
    a=1;b=1;
    volatile int r=I2CMasterDataGet (I2C1_base);
    返回 r;
    }[/报价]

    您能否更改此代码段,因为我无法理解错过了 put ()函数的位置。  

    此致、

    Ankit。

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

    请注意(已添加)"PUT"(显示在突出显示部分第6行)。   StellarisWare 下需要这样做-我们的客户要求我们继续使用它(因为它是如此稳定/完美) -因此我们没有使用较新的 TIWare 的经验。

    这并不难于测试/验证-在对"I2CMaster Control()"(第3行)的(第一次)调用后检查您的范围捕获-使用和不使用前面的"PUT"-然后在对"I2CMasterControl()"的第二次调用之前重复此操作。 (第7行)  为了提高清晰度和安全性、我更希望看到您使用"真实值"而不是"寄存器"(带"输入")-至少在故障排除阶段...

    Ankit Kumar
    INT I2CReceive (int slave_addr、int reg)

    I2CMasterSlaveAddrSet (I2C1_base、slave_addr、false);
    I2CMasterDataPut (I2C1_base、reg);
    I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);
    while (I2CMasterBusy (I2C1_base)) a++;
    I2CMasterSlaveAddrSet (I2C1_base、slave_addr、true);  
    I2CMasterDataPut (I2C1_base、reg);
    I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_Receive);
    while (I2CMasterBusy (I2C1_base)) b++;
    a=1;b=1;
    volatile int r=I2CMasterDataGet (I2C1_base);
    返回 r;