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.

TMS320F28335使用软件模拟I2C接口时GPIO应该如何设置?

换个说法,如何将28335的GPIO设置成开漏输出呢?

之前使用硬件I2C接口,工作正常,但是因为I2C外设管脚和另外一个外设管脚重复了,只能将I2C接口转移到其它GPIO上,使用软件模拟。
使用软件模拟I2C时,GPIO应该如何设置呢?看datasheet中,28335的GPIO source和sink电流能力都是4mA,因此不太可能是C51上那种准双向口,输出很可能是推挽输出的,GPIO也不像STM32的GPIO那样,可以明确设置成OD输出,只有一个上拉电阻选项,因为电路外部有上拉电阻,这个上拉电阻其实不太重要。
如果将28335的GPIO作为开漏输出使用应该如何设置呢?设置成输入还是输出? 是否需要使能上拉电阻?有没有相关的文档号或者应用手册?谢谢。

  • 中途肯定要切换的,发送的时候就是输出,接受的时候就是输入。

  • 28335的管脚配置为GPIO,只做方向选择,与上拉是否禁止操作。

    I2C两根线,clk时钟线是有cpu提供,所以一直配置为输出,而data线,既需要写也需要读,在器件操作过程中需要进行输入输出模式的切换。

  • 如果是slave,SCL可以一直为输入

  • 28335访问I2C总线上的EEPROM和RTC,28335的角色是主。
    28335需要驱动总线的时候SCL和SDA设置为输出,不需要的时候设置为输入,传输过程中输入输出不停切换?对吧?
    换句话说,28335的GPIO本身是不支持三态输出的? 

  • 28335是master

  • 如果F28335是master,那始终要对总线进行控制,你所指的三台是指还有开漏输出的状态吗?

  • 三态就是指开漏输出,C51的准双向口可以模拟三态输出。STM32可以设置成推挽,OD。上拉下拉电阻都可以设置。28335似乎只有推挽输出?

    28335用下面的宏可以完成模拟三态输出吗?GPIO32和GPIO33有外部上拉电阻。

    #define SWI2C_SCL_HIGH() {GpioCtrlRegs.GPBDIR.bit.GPIO33=0;GpioDataRegs.GPBSET.bit.GPIO33=1;}
    #define SWI2C_SCL_LOW() {GpioCtrlRegs.GPBDIR.bit.GPIO33=1;GpioDataRegs.GPBCLEAR.bit.GPIO33=1;}

    #define SWI2C_SDA_HIGH() {GpioCtrlRegs.GPBDIR.bit.GPIO32=0;GpioDataRegs.GPBSET.bit.GPIO32=1;}
    #define SWI2C_SDA_LOW() {GpioCtrlRegs.GPBDIR.bit.GPIO32=1;GpioDataRegs.GPBCLEAR.bit.GPIO32=1;}
    #define SWI2C_SDA_GET() GpioDataRegs.GPBDAT.bit.GPIO32

     

  • 公布一下答案,用一下的宏即可。C2000系列IO不能支持开漏输出,GPIO输出拉高时是推挽输出,需要及时设置成输入模式,放弃总线的控制,I2C上的其它设备才能使用总线。注意修改方向控制需要打开EALLOW保护。

    #define SWI2C_SCL_HIGH() {GpioDataRegs.GPBSET.bit.GPIO33=1;EALLOW;GpioCtrlRegs.GPBDIR.bit.GPIO33=0;EDIS;}
    #define SWI2C_SCL_LOW() {EALLOW;GpioCtrlRegs.GPBDIR.bit.GPIO33=1;EDIS;GpioDataRegs.GPBCLEAR.bit.GPIO33=1;}

    #define SWI2C_SDA_HIGH() {GpioDataRegs.GPBSET.bit.GPIO32=1;EALLOW;GpioCtrlRegs.GPBDIR.bit.GPIO32=0;EDIS;}
    #define SWI2C_SDA_LOW() {EALLOW;GpioCtrlRegs.GPBDIR.bit.GPIO32=1;EDIS;GpioDataRegs.GPBCLEAR.bit.GPIO32=1;}
    #define SWI2C_SDA_GET() GpioDataRegs.GPBDAT.bit.GPIO32