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.

[参考译文] TM4C129XNCZAD:TM4C129XNCZAD

Guru**** 2416400 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/753950/tm4c129xnczad-tm4c129xnczad

器件型号:TM4C129XNCZAD

您好,

我使用 Tiva c TM4C129X 开发板、并使用 I2C 协议进行数据传递。

我想将微控制器中的 I2C0用作主器件、将 I2C1用作从器件。

我将 I2C0 SDA 和 SCL 连接 到硼中的 I2C1。 含义: 端口 PB3至 PG1、端口 PG0至 PG2。

我编写了所附的程序、程序卡在" while (I2CMasterBusy (I2C0_BASE)"的循环中

您能不能帮助我解决我的问题。

此致、

Eliran。
  
    


#include
#include
#include
#include
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/i2c.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"


//原型函数
 空 I2C0Handler (空);
 void I2C1Handler (void);


//主函数
int main()

 volatile uint32_t SYSCLK=0;
 volatile uint32_t recvivied_data=0;
 volatile char ch;
 //设置时钟
 SYSCLK=SysCtlClockFreqSet (SYSCTL_OSC_INT|SYSCTL_USE_PLL|SYSCTL_CFG_VCO_320、16000000);

 //启用 i2c 外设
 SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);    // clk PB2,data PB3
 while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));
 
 SysCtlPeripheralEnable (sysctl_Periph_I2C1);   // clk PG0,data PG1
 while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C1));
 
 
 //设置 i2c 时钟
 I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true);
 //指定要从主器件发送的从器件地址
 
 I2CMasterSlaveAddrSet (I2C0_BASE、0x3B、false);
 
 
 I2CSlaveInit (I2C1_base、0x3B);
 
 I2CMasterDataPut (I2C0_BASE、'q');
 
 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
 
 //启用处理器中断。
 
 // IntMasterEnable();
 
   
 while (I2CMasterBusy (I2C0_BASE))
 {
   
 }
 
 recvived_data=I2CSlaveDataGet (I2C1_base);
 ch=(char) recived_data;
 返回0;


 空 I2C0Handler (空)
 {
  
 }
 
  空 I2C1Handler (空)
 {
  
 }

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

    您是否连接了上拉电阻器? 有关正确配置 I2C 总线的信息、请参阅:

    http://www.ti.com/lit/an/slva704/slva704.pdf

    下面是一个将 I2C0连接到 I2C2的示例:

    /cfs-file/__key/communityserver-discussions-components-files/908/I2C0MtoI2C2S.zip

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

    尊敬的 Bob:

    非常感谢您的回答。

    我重写了我的代码、不幸的是、它的剂量仍然无效。

    我激活了 SDA 线路中的上拉电阻器

    问题仍然存在:

    while (I2CMasterBusy (I2C0_BASE))

    看起来主器件总是很忙。

    有什么想法吗?
     

    我的新代码是:


    #include
    #include
    #include
    #include
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/i2c.h"
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_NVIC.h"
    #include "inc/hw_types.h"
    #include "driverlib/timer.h"
    #include "driverlib/uart.h"
    #include "driverlib/pin_map.h"
    //#include "inc/tm4c129xncszad.h"


    //原型函数
     空 I2C0Handler (空);
     void I2C1Handler (void);


    //主函数
    int main()

     volatile uint32_t SYSCLK=0;
     volatile uint32_t recvivied_data=0;
     volatile char ch;
     //设置时钟
     SYSCLK=SysCtlClockFreqSet (SYSCTL_OSC_INT|SYSCTL_USE_PLL|SYSCTL_CFG_VCO_320、16000000);

     //启用 i2c 外设
     SysCtlPeripheralDisable (SYSCTL_Periph_I2C0);// clk PB2,data PB3
    SysCtlPeripheralReset (SYSCTL_Periph_I2C0);   // clk PG0,data PG1
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));
     
     
     SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);    
     while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C1));
     
     //启用 I2C 的 GPIO 端口       
     SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
     SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
     
       //为 i2c0配置引脚复用
     GPIOPinConfigure (GPIO_PB2_I2C0SCL);
     GPIOPinConfigure (GPIO_PB3_I2C0SDA);
     
      //为 i2c1配置引脚复用
     GPIOPinConfigure (GPIO_PG0_I2C1SCL);
     GPIOPinConfigure (GPIO_PG1_I2C1SDA);
     
     //为此引脚选择 i2c 函数。
     //还配置 i2c 的引脚
     //将它们设置为开漏
     //
     //
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_3);
    GPIOPinTypeI2C (GPIO_PORTG_base、GPIO_PIN_1);
    GPIOPinTypeI2CSCL (GPIO_PORTG_BASE、GPIO_PIN_0);
    GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_2、GPIO_Strength _12mA、GPIO_PIN_TYPE_STD);
    GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_Strength _12mA、GPIO_PIN_TYPE_OD);
    GPIOPadConfigSet (GPIO_PORTG_base、GPIO_PIN_0、GPIO_Strength _12mA、GPIO_PIN_TYPE_STD);
    GPIOPadConfigSet (GPIO_PORTG_base、GPIO_PIN_1、GPIO_Strength _12mA、GPIO_PIN_TYPE_OD);

     //设置 i2c 时钟
     I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
     
     //指定要从主器件发送的从器件地址
     
     I2CMasterSlaveAddrSet (I2C0_BASE、0x3B、false);
     
     I2CSlaveEnable (I2C1_base);
     I2CSlaveInit (I2C1_base、0x3B);
     
     
     
     I2CMasterDataPut (I2C0_BASE、'q');
     
     I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
      
      
      
        
     while (I2CMasterBusy (I2C0_BASE))
     {
       
     }
     
     recvived_data=I2CSlaveDataGet (I2C1_base);
     ch=(char) recived_data;
     返回0;