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.

[参考译文] MSPM0C1104:如何使用 SMBus 发送4个以上字节。

Guru**** 2398695 points
Other Parts Discussed in Thread: MSPM0C1104, BQ40Z50

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1509118/mspm0c1104-how-to-send-more-than-4-bytes-using-smbus

器件型号:MSPM0C1104
主题中讨论的其他器件: BQ40Z50

工具/软件:

你(们)好  

    

在 MSPM0C1104中 [ #define I2C_SYS_FENTRIES  (4)/*!< FIFO 条目数*/]。 SMBus/I2C TX/RX 缓冲区大小仅为4个字节。  我们不能增加该值。 因此、我们无法使用[DL_I2C_fillControllerTXFIFO]、[ DL_I2C_startControllerTransferAdvanced]、[DL_I2C_startControllerTransferAdvanced]等函数填充和发送超过4字节的数据。对于闪存写入/块写入、我们需要超过4个字节。 我尝试了许多选项(如下所示)、但仍然只发送4个字节。

 

将此 MCU 和功能与 BQ40Z50 R2结合使用。

gI2cControllerStatus = I2C_STATUS_IDLE;

gTxLen = count+1;// I2C_TX_PACKET_SIZE;//count+1;//I2C_TX_PACKET_SIZE;

gTxCount = DL_I2C_fillControllerTXFIFO (SMBus_0_INST、&I2Ctxbuff[0]、gTxLen);
/*如果要发送的字节更多*/、则启用 TXFIFO 触发中断
if (gTxCount < gTxLen){
DL_I2C_enableInterrupt (SMBus_0_INST、DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER);
}
暴露

DL_I2C_disableInterrupt (SMBus_0_INST、DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER);
}

/*
*将数据包发送到控制器。
*此函数将自动发送启动+停止。
*/
gI2cControllerStatus = I2C_STATUS_TX_STARTED;

while (!(DL_I2C_getControllerStatus (SMBUS_0_INST)& DL_I2C_CONTROLLER_STATUS_IDLE));

DL_I2C_startControllerTransfer (SMBus_0_INST、I2C_TARGET_ADDRESS、DL_I2C_CONTROLLER_DIRECTION_TX、gTxLen);

/*等待控制器发送所有字节*/
while ((gI2cControllerStatus!= I2C_STATUS_TX_COMPLETE)&&(gI2cControllerStatus!= I2C_STATUS_ERROR))

__ WFE ();
}

while (DL_I2C_getControllerStatus (SMBus_0_INST)& DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
;
uint32_t STATUS = DL_I2C_getControllerStatus (SMBus_0_INST);
/*如果出现错误则告警*/
if (DL_I2C_getControllerStatus (SMBus_0_INST)&
DL_I2C_CONTROLLER_STATUS_ERROR){
/*如果出现错误、LED 将保持高电平*/
__ BKPT (0);


// IF (STATUS 和 DL_I2C_CONTROLLER_STATUS_NACK)
// printf ("NACK received!\n");

IF (STATUS 和 DL_I2C_CONTROLLER_STATUS_ARbitration_LOST)
__ BKPT (2);

// IF (STATUS 和 DL_I2C_CONTROLLER_STATUS_BUS_ERROR)
// printf ("总线错误!\n");

IF (STATUS 和 DL_I2C_CONTROLLER_STATUS_ERROR)
__ BKPT (3);

}

while (!(
DL_I2C_getControllerStatus (SMBus_0_INST)且 DL_I2C_CONTROLLER_STATUS_IDLE)

它停止在 _bKPT (3)处;始终。

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

    1) FIFO 实际上为8个字节[参考 TRM (SLAU893A)第13.1.2]节。 但是、是的、如果您想要执行更大的传输、则需要在事务运行时填充/耗尽 FIFO。

    2)此代码看起来像是起源于示例 i2c_controller_rw_multibyte_fifo_interrupts。 该示例使用 ISR 根据需要填充/耗尽 FIFO。 (根据提供的信息、它使用 Tx / Rx 长度16。)

    3)如果你达到了 BKPT(3)我的第一猜测是你得到了一个否定。 对于该用例、首先要检查您使用的 I2C 地址(示例中为 I2C_TARGET_ADDRESS)。

    [编辑:添加参考文献]