已编辑:语法和格式
我在使用裸机解决方案发送 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 仅限于全功能^^*/ }