【问题标题】:Tiva C cannot change value of MDR registerTiva C 无法更改 MDR 寄存器的值
【发布时间】:2023-03-27 20:36:01
【问题描述】:

我有一个 tiva c 微控制器 tm4c123gxl,我一直在尝试使用板上的 I2C 模块和数字加速度计但没有结果,我一直在尝试设置 @987654323 @注册一个特定的值发送但它保持为0

这是我用于初始化的代码,直到到达我设置 MDR 寄存器的部分,我使用分步调试我最初将代码运行到 I2C3_MDR_R = 0x2D; 的分配步骤

void PortDInit(void)
{
volatile unsigned long delay=0;
    SYSCTL_RCGCI2C_R|=0x8;             //1-set clock of I2C of module 3 
    delay = SYSCTL_RCGC2_R;            //2-delay to allow clock to stabilize
    SYSCTL_RCGC2_R |= 0x00000008;      //3-port D clock
    delay = SYSCTL_RCGC2_R;            //4-delay to allow clock to stabilize     
    GPIO_PORTD_AFSEL_R |= 0x03;        //5-alternate function set for I2C mode
    GPIO_PORTD_DEN_R |=0x03;          //6-enable digital functionality for PA6 and PA7
    GPIO_PORTD_ODR_R|=0x02;                  //7-enable open drain mode for I2CSDA register of port A
    GPIO_PORTD_PCTL_R = 0x00000033;   //8-set PCTL to I2C mode
    I2C3_MCR_R= 0x00000010;                     // 9-intialize the i2c master
    I2C3_MTPR_R = 0x00000007;                   // 10-number of system clock cycles in 1 scl period
I2C3_MSA_R = 0x3A // set slave address and read write bit
I2C3_MDR_R = 0x2D;                                  // data to be sent BREAK POINT HERE using single step here yields MDR with same value = 0
I2C3_MCS_R = 0x00000003;                                  // follow transmit condition
    while(I2C3_MCS_R &= 0x40 == 1);                 // wait bus is busy sending data
    if(I2C3_MCS_R&=0x04 ==1)
    {
        //handle error in communication
    }
    else
    {
        //success in transmission 
    }

我为达到此代码所做的工作

  • 仔细了解 I2C 协议的工作原理等。
  • 检查数据表并按照其中提到的初始化步骤一步一步地让我得到这个代码
  • 我知道我应该使用 tivaware 库,它会更容易但使用 寄存器帮助我更多地了解一切是如何运作的, 我还是个学生
  • 起初我没有数字启用线,因为它没有被提及 为 I2C 激活,但唯一合乎逻辑的是它应该在那里 当我们使用数字值时,我尝试过两者都产生了相同的结果 输出 mdr=0
  • 我使用 keil 4 作为我的 IDE,我正在查看寄存器的值 I2C 模块 3 了解数据是否放在 MDR 中

希望有人帮忙 谢谢。

【问题讨论】:

  • 是“mdr=0”,如“我在引脚上有示波器/逻辑分析仪,我可以看到正在传输的零字节”或“我不明白这些数据是如何传输的”注册作品”?如果是后者,请注意数据表中关于它是读取敏感的内容;我不具体了解这部分,但一般来说,不应该假设写入双向数据/FIFO 类型寄存器的任何内容都可以再次读出。
  • @Notlikethat mdr=0 is both什么数据

标签: c arm microcontroller keil


【解决方案1】:

这是一个很长的镜头,但这里是:

在您的 cmets 中,第 6 步说

//6-enable digital functionality for PA6 and PA7

但您似乎正在处理 GPIO_PORTD...

可能是注释错误(您的意思是 PD6 和 PD7) 但请仔细检查您是否正在查看正确的引脚...

祝你好运!

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 2021-01-21
    • 2016-06-15
    • 2016-04-07
    • 1970-01-01
    • 2015-07-15
    • 2019-12-10
    • 2020-11-04
    • 2013-03-04
    相关资源
    最近更新 更多