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.

[参考译文] DM3730:I2C 发送问题-仅写入一个字节时发送两个字节。

Guru**** 2554790 points
Other Parts Discussed in Thread: DM3730

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/617437/dm3730-i2c-transmit-issue---sends-two-bytes-when-only-write-one

器件型号:DM3730

已编辑:语法和格式

我在使用裸机解决方案发送 I2C 数据时遇到问题。 我查看了用于 Linux 的 OMAP-i2c 驱动程序和用于为 DM3730生成我自己的裸机驱动程序的 AM35xx Starterware 驱动程序。 驱动程序在一次仅发送1个字节的日期(将 I2C_CNT.DCOUNT 设置为1)时工作正常、但当我要发送多个字节(例如将 I2C_CNT.DCOUNT 设置为2)时出错。 出于某种原因、当我只向 I2C_DATA 寄存器写入一个字节时、系统会认为需要发送两个数据字节。 I2C 寄存器为16位、但通过查看存储器浏览器、它们被视为32位、其中高16位是您写入的寄存器、低16位是高寄存器的影子副本。 对于大多数寄存 器、在存储器浏览器中编辑影子副本无效、只能写入高16位、然后影子副本更新。 对于 I2C_DATA 寄存器、您可以写入高位和低位字。 目前、我通过将 i2c 有效载荷的两个字节写入高位和低位字来解决我的问题。 硬件首先发送低字、然后发送高字。 但是,必须有更好的方法来做到这一点。

void I2C_Write (struct i2c_adapter cfg、struct i2c_msg、int stop)
{
/*^^ Excerpt only not full function ^^*/


SetupI2C (cfg);
无符号短整型数据;
无符号短整型状态;
/*设置 i2c 从器件地址*/
I2CMasterSlaveAddrSet (cfg.i2c_controller、cfg.slave_address);

/*数据计数指定要传输的字节数*/
I2CSetDataCount (cfg.i2c_controller、msg.len);

numOfBytes = I2CDataCountGet (cfg.i2c_controller);

/*清除 Tx 和 Rx FIFO */
I2CMasterClearFIFO (cfg.i2c_controller);//设置 I2C_BUF 寄存器中的位以清除 FIFO

/*在主发送器模式下配置 I2C 控制器*/
I2CMasterControl (cfg.i2c_controller、I2C_CFG_MST_TX);

/*通过 I2C 总线生成启动条件*/
I2CMasterStart (cfg.i2c_controller);

if (停止)
I2CMasterControl (cfg.i2c_controller、I2C_CFG_STOP);

/*获取状态*/
状态= I2CMasterIntStatus (cfg.i2c_controller);

if (((status & I2C_STAT_Transmit _READY)>> I2C_STAT_XRDY_SHIFT)
{
unsigned int num_Bytes = msg.len;
while (num_Bytes)
{
num_Bytes--;
数据= 0;
if (msg.len)
{
数据=*msg.buf++;
MSG.len-;
}
/*将数据放入 i2c 的数据发送寄存器*/
I2CMasterDataPut (cfg.i2c_controller、data);//等效于 HWREG (baseAddr + I2C_data、data);或*(int*)(baseAddr + I2C_CON)= data;
}
}

/*^^ Excerpt 仅限于全功能^^*/
} 

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

    I2C 驱动器在发送一个字节时工作正常、因为它被放置在最低字中。 您决定解决问题似乎是合理的。

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

    我发现了我的错误。 我需要使用短类型指针而不是 int 类型指针写入 I2C 寄存器、尤其是 I2C_DATA 寄存器。

    错误方式:
    *(int*)(i2c_baseAddr + i2c_reg_offset)= so_int_value;

    正确方法:

    *(short*)(i2c_baseAddr + i2c_reg_offset)= so_short_value;

    现在一切都按预期工作。