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.

[参考译文] LAUNCHXL-F28069M:I2C、TX FIFO、F280xx 上无 RX 和中断

Guru**** 2601915 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/676395/launchxl-f28069m-i2c-tx-fifo-no-rx-and-no-interrupt-on-f280xx

器件型号:LAUNCHXL-F28069M
主题中讨论的其他器件:C2000WARE

你(们)好

我想将 I2C 配置为仅在主机模式下使用 TX FIFO、而不使用中断

我只需要 Tx 作为主器件、无需读取(Rx)。 它用于控制 OLED 屏幕 SSD1306

在多次搜索和示例之后、我成功使用了此配置

配置

///----------------------------------
// InitI2C -此函数将 I2C 初始化为已知状态。
void InitI2C()
{
//初始化 I2C-A
I2CARegs.I2CMDR.ALL = 0x0000;
I2CARegs.I2CISAR = I2C_SLAVE_ADDR;//从地址
// 90 MHz/(((8+1)(10+5 + 5+5))= 400 kHz
I2CARegs.I2CPSC.ALL = 8;//预分频器-在模块 clk
I2cRegs.I2CCLKL = 10上需要7-12MHz;//注:必须是非零
I2cRegs.I2CCLKH = 5;//注:必须是非零

// I2cirRegs.I2CIER = 0x24;// SCD & I2AR.0100

;中断= 0X0X0XI2AR.I2CIER = 0100;/中断= 0X0XI2AR.I2AR.I2AR.I0100//寻址为从机中断使能位
// I2cirRegs.I2CIER.bit.SCD = 1;//停止条件检测到的中断使能位
// I2cirRegs.I2CIER.bit.XRDY = 0;//发送数据就绪中断使能位
// I2cir.bit.I2r.I2I
=
0;//接收数据就绪中断就绪= 0;I2CIEr.I2I2I2ARRn = 0//无确认中断使能位
// I2caRegs.I2CIER.bit.ARBL = 0;//仲裁丢失中断使能位

// I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO
I2caRegs.I2CFFTX.BIS= 0x6000;//启用 TX2CFI2RFT.I2RFIFT.I2RFIF.I2FIFO
=1
位;TX2RFIF.I2RFIF.I2RFIF.I2RFIF.I2RFIF.I2FIFO =发送 FIFO;TX.I2RFIF.I2RFIF.I2RFIF.I2RFIF.I2RFIF.I2RFIF.I2RFIF.I2RFIF//清除 TXFFINT 标志
I2caRegs.I2CFFTX.bit.TXFFIENA=0;//当置位
I2caRegs.I2CFFTX.bit.TXFFIL = 0时,TXFFINT 标志不会产生中断;//发送 FIFO 中断级别//I2caRegs.I2CFX.BIT.0**


;无 RXFFI0**位/RXFFIRFIF.RFI0**
//清除 RXFFINT 标志
I2CARegs.I2CFFRX.bit.RXFFIENA=0;//当置位
I2CARegs.I2CFFRX.bit.RXFFIL = 0时、RXFFINT 标志会生成一个中断;//接收 FIFO 中断级别

//I2CARegs.I2CMDR.ALL = 0xI2CMDR.0时、RXFFIL = 0;//接收 FIFO 中断位/I2CA.I2CMDR.I2CMDR.0;当暂停
时、I2I2I2CMDR.I2I2CMDR.0 = 0 =
0;/停止 I2I2I2I2I2I2CMDR.I2I2I2CMDR.I2I2CMDR//暂停
I2caRegs.I2CMDR.bit.STT = 0时停止 I2C;//开始条件位
I2caRegs.I2CMDR.bit.STP = 0;//停止条件位
I2caRegs.I2CMDR.bit.MST = 0;//从模式
I2caRegs.I2CMDR.0 =

0;/ I2c.I2c.I2e.I2c.0;/ I2ca-R2.I2e.I2e.I2c.R2.ICMT.0 = 0;/位重复模式
//数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1;// I2C 模块被启用
I2caRegs.I2CMDR.bit.STB = 0;// I2C 模块不在起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0;//自由数据格式
为8位/ I2b.R

oledInit();
oledClear();
oledGotoYX( 0,0);
oledPrint("PWM");
}
///----------------------------------
int16_t i2c1Xfer (
uint8 address、
uint8* wdata、int wsize、
uint8* RDATA、int rsize)
{
uint16 i;

//I2cRegs.I2CMDR.bit.IRS = 1;

//确保 I2C 不忙且已停止
//while (I2cRegs.I2csr.bit=
1;//确保 I2C 不忙;// while = 1)//清除 SCD 位(停止条件位)
//while (I2caRegs.I2CMDR.bit.STP = 1);//停止位循环

I2caRegs.I2CSAR =地址;// I2C 从器件地址
//while (I2cRegs.I2CSTR.bit.BB = 1);//仍然忙?

I2caRegs.I2CCNT = wsize;//设置要发送


的字节数(i=0;i 

这个顺序应该给出0x3C 为一个写入顺序(1位移位)、然后是0x80 (cmd)、然后是0xA7

而不是这样

我对以 8位时钟开始的情况感到奇怪、在写入模式下、0比 Stop 更像底座、没有第一个字节比结束字节更好???? 没有停止位

如果我尝试在它停止工作时添加...

感谢你的帮助

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

    这是有效的代码

    ///----------------------------------
    int16_t i2c1Xfer(
    uint8 address、
    uint8* wdata、int wsize、
    uint8* rdata、int rsize )
    {
    uint16 i;
    I2caRegs.I2CSAR =地址;// I2C 从地址
    
    I2caRegs.I2CCNT = wsize;//设置要发送
    
    I2caRegs.I2CMDR.ALL = 0x6E20;//发送 TX FIFO:0110 1110 0010 0000
    //I2caRegs.I2CMDR.BICKMOD = 0;// nack 模式位
    // I2ce.I2caRegs.I2c.I2cADDR.I2e.I2CMDR.I2e.I2CMDR.I2CMDR.I2CMDR.I2e.I2CMDR.I2CMDR.I2CMDR.I2CMDR.I2CMDR.I2R/当 I2CMDR.I2CMDR.R
    //起始条件位
    //I2cRegs.I2CMDR.bit.STP = 1;//停止条件位
    //I2cRegs.I2CMDR.bit.MST = 1;//主模式
    //I2cRegs.I2CMDR.bit.TRX = 1;//发送模式
    // I2CMDR.I2C.0/
    位重复模式
    // I2CMDR.bit = 0/ I2CMDR.bit 0;// I2CMDR.bit.0///数字回送模式被禁用
    //I2cRegs.I2CMDR.bit.IRS = 1;// I2C 模块被启用
    //I2cRegs.I2CMDR.bit.STB = 0;// I2C 模块不在起始字节模式
    //I2cRegs.I2CMDR.bit.FDF = 0;
    // I2CMDR.BIC.0 = 0;/数据格式为0;/ I2CMDR.BIC.BC.0///每个数据字节8位
    
    (i=0;<wsize; i++) { I2caRegs.I2CDXR = *(wdata+i); while(!I2caRegs.I2CSTR.bit.XRDY); } return I2C_SUCCESS; } i
    
    
    
    
    
    
    
    

    在重新放入 TX FIFO 之前、我必须等待数据真正被传输

    如果您的想法比等待该 FIFO 更好、请告诉我

    (由于发送了数据、无法在 FIFO 上使用中断)

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

    您应该能够写入所有要传输的数据、并且它将按 FIFO 顺序发送。

    如果您使用以下代码、是否仍然存在问题?

    int i2cxfer()

    I2caRegs.I2CSAR =地址; // I2C 从地址

    while (!I2caRegs.I2CSTR.bit.BB = 1);//确保总线在传输前不忙

    I2caRegs.I2CCNT = wsize; //设置要发送的字节数

    for (i=0;<wsize;i++) {
    I2caRegs.I2CDXR =*(wdata+I);//用数据填充 FIFO


    I2caRegs.I2CMDR.ALL = 0x6E20;//开始传输

    返回 I2C_sucess;//如果要进行任何错误检测,可能需要将一些实际检查与该值相关联。



    上述代码是对 C2000Ware 中 I2C_EEPROM 示例的改编。

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

    我将代码放在 GitHub 上、供想要使用它的人使用

    https://github.com/blotfi/c2000_OLED_SSD1306

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Mark、但我的数据超过了4字节深度 FIFO。 最多可以是9个字节
    因此、我们需要等待 I2C 完成传输、然后再将新数据放入 I2caRegs.I2CDXR 中
    检查上的例程
    github.com/.../c2000_OLED_SSD1306
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Lotfi、

    我很高兴您能让它正常工作、并感谢您分享您的代码! 希望将来查看此主题的其他人会发现它很有用。

    -Mark