主题中讨论的其他器件: 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)处;始终。