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.
我们的一个客户使用 MSPM0 通过 I2C 与 IO 扩展器 TCA9539通信。
一个操作是重复启动的写入数据读取数据操作。 下面是代码:
通用位8 I2C_CfgReadTransfer (Uint32* Register、Uint32 slave_address、uint8 RegisterAddress、uint8 *I2C_in_buffer、uint8 i2c_buffer_length )
{
T_I2C_MASTER_TRANSMIT_STATUS RETURE_VALUE = I2C_MASTER_ERR_BUFFER_OVERIFLOW;
UINT8接收计数器;
DL_I2C_enableController ReadOnTXEmpty ((I2C_Regs*)寄存器);
/*使用 Tx 数据填充 FIFO。 完整传输为8个字节、只有4个字节
* GPIO 端口扩展器需要*/
DL_I2C_fillControllerTXFIFO (((I2C_Regs*)寄存器)、&RegisterAddress、(uint16) C_I2C_REG_ADD_SIZE);
如果 ((C_I2C_RX_MAX_packet_size > i2c_buff_length)和(0u!= i2c_buff_length))
{
如果 ( C_I2C_MAX_7_BIT_ADD >= SLAVE_ADDRESS )
{
/*等待 I2C 进入空闲状态*/
同时 (!(DL_I2C_getControllerStatus ((I2C_Regs*))和 C_I2C_CONTROLLER_IN_IDLE_MASK));
/*此函数自动发送"开始+停止"*/
DL_I2C_startControllerTransfer (((I2C_Regs*) Register)、slave_address、DL_I2C_controller_direction_rx、(i2c_buff_length);
/*从目标接收所有字节*/
附录四
. } 突出显示的 API 调用是正确的、能够启动所需的操作。 但是、它不起作用、因为最后一个 API DL_I2C_startControllerTransfer ()清除(覆盖)先前的 DL_I2C_enableControllerReadOnTXEmpty ()调用设置的 RD_ON_TXEMPTY 位。 这是 DL_I2C_startControllerTransfer API 上的一个问题。
Ansong、您好!
我只是在我的终端测试了它、它看起来像预期的那样工作。
调用 DL_I2C_startControllerTransfer 时、您使用哪个版本的 SDK 以及在总线上生成什么流量?
DL_I2C_startControllerTransfer 会屏蔽要写入的位、 因此不应覆盖 RD_ON_TXEMPTY。
此致、
布兰登·费舍尔
我们的 SDK 版本 mspm0_SDK_1_00_00_04
以下是我们的源代码:
__static_inline void DL_I2C_startControllerTransfer (I2C_Regs * i2c、
uint32_t targetAddr、DL_I2C_CONTROLLER_DIRECTION 方向、
uint16_t 长度)
{
//指定目标地址和读取/写入模式
DL_Common_updateReg (&i2c->master.msa、
((targetAddr << I2C_MSA_SADDR_OFS)|(uint32_t)方向)、
(I2C_MSA_SADDR_MASK | I2C_MSA_DIR_MASK);
//停止位在传输突发长度字节数后生成
DL_Common_updateReg (&i2c->MASTER.MCTR、
(((uint32_t)长度<< I2C_MCTR_MBLEN_OFS)| I2C_MCTR_BURSTRUN_ENABLE |
I2C_MCTR_START_ENABLE | I2C_MCTR_STOP_ENABLE)、
(I2C_MCTR_MBLEN_MASK | I2C_MCTR_BURSTRUN_MASK | I2C_MCTR_START_MASK |
I2C_MCTR_STOP_MASK));
}
从突出显示的掩码值开始、您可以看到它屏蔽了 RD_ON_TXEMPTY 位。
Ansong、您好!
我建议更新至最新版本(https://www.ti.com/tool/MSPM0-SDK#downloads) 1.20版。 这就是我正在使用的 SDK 版本、它在哪里看起来可以正常工作。
DL_Common_updateReg 的工作方式是使用掩码的倒数来保留旧寄存器值、然后将旧寄存器值与新寄存器值一同写入回写、从而避免更改任何内容。 有关该函数的源代码、请参阅下面的。
/** * @brief Writes value to specified register - retaining bits unaffected by mask. * * @param[in] reg Pointer to the register overlay for the peripheral. * @param[in] val Value to be written to the register. * @param[in] mask Mask defines which bits will be altered. */ __STATIC_INLINE void DL_Common_updateReg( volatile uint32_t *reg, uint32_t val, uint32_t mask) { uint32_t tmp; tmp = *reg; tmp = tmp & ~mask; *reg = tmp | (val & mask); }
如果该掩码包含 I2C_MCTR_RD_ON_TXEMPTY_MASK、我会预期它会无意中将该值消隐。
您是否有逻辑分析仪或可以使用任何其他任何器件来探测 I2C 引脚? 调用 DL_I2C_startControllerTransfer 后、您是否会在 CCS 的寄存器视图中看到 RD_ON_TXEMPTY 位复位?
此致、
布兰登·费舍尔
您好、Brandon:
DL_I2C_startControllerTransfer 调用后不会清除 RD_ON_TXEMPTY、这是真的。 事实证明、根本原因是客户在呼叫中使用了错误的地址值。
问题已解决。 感谢你的帮助。