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.

[参考译文] CCS/MSP432E401Y:MSP432E401Y I2C Salve DMA

Guru**** 2528570 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/872943/ccs-msp432e401y-msp432e401y-i2c-salve-dma

我的 MSP432器件充当 I2C 从器件、并希望使用 DMA 接收数据。 我希望在中断 I2C0_IRQHandler()中接收数据。

-我是否必须使用 I2C FIFO 运行 DMA?

-我能否轮询 INT 状态标志以接收数据而不是接收 INT 内部的数据?

-接收完数据后是否需要重置 DMA?

下面是我的设置。 FIFO 未触发中断。 我想什么了吗?

void I2C0_IRQHandler (UArg_arg)
{
uint32_t getStatus;
getStatus = MAP_I2CSlaveIntStatusEx (I2C0_BASE、TRUE);
MAP_I2CSlaveIntClearEx (I2C0_BASE、getStatus);
if (getStatus 和(I2C_SLAVE_INT_RX_FIFO_FULL | I2C_SLAVE_INT_RX_DMA_DONE))
{
//尝试在此处获取数据
:}
}

静态空 initI2C (void)
{
Hwi_Params hwiParams;
Hwi_Handle handle;
Error_Block EB;


MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!(MAP_SysCtlPeripheralReady (SYSCTL_Periph_GPIOB)))
)){MAP_GPIO2TP_PM_GPIOTPSIBLE_GPIOTP2TP_GPIOTPSIB_3




;配置 GPIOTPSI_GPIOTP_GPIOTP_GPIOTP_PI_PI_3;GPIOTP_GPIOTPSI_PI_PI_PI_PI_PI_PI_PI_PI_PI_PI_PIOTP2TPSIB_PI_3;GPIOTP_GPIOTP_PI_
GPIO_PIN_2);

//由于没有电路板上拉,因此我们应启用内部弱
*上拉*/
GPIOB->PUR |=(GPI_PIN_2 | GPIO_PIN_3);


MAP_INIT PeripheralEnable (sysctl_Periph_I2C0);
while (!(map_SysCtl_PIN_3);map_init_peralams (sys_parwi0






)
;parwiptl (sys_iph_iph_iph_iptl (sys_iptl);params (sys_ip_iptl 优先级);sys_iptl (sys_ip_ip_iptl);sys_iprandrandralHandle 0_iptl (sys_iptl);parh_ip hwiParams、&EB);
if (handle = NULL)
while (1){};


MAP_I2CSlaveEnable (I2C0_BASE);
MAP_I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS);

MAP_I2CRxFIFOConfigSet (I2C0_BASE、 I2C_FIFO_CFG_RX_SLAVE |
I2C_FIFO_CFG_RX_SLAVE_DMA |
I2C_FIFO_CFG_RX_TRIG_4);
MAP_I2CRxFIFOFlush (I2C0_BASE);

MAP_I2CSlaveIntEnableEx (I2C0_BASE、(I2C_SLAVE_RX_FIFO_FULL_INTOP_START



);* INIT_INT_INT_INT_INT_INT_INT_INT_INT_START)* INT_INT_INT_INT_INT_INT_INTRUST_INT_START (INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_IN




MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
MAP_SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA);
while (!(map_SysCtlPeripheralReady (SYSCTL_Periph_UDMA))))
{
}

map_uDMAEnable();

map_uDMAControlBaseSet (pui8ControlTable);

MAP_uDMAChannelAssign (UDMA_CH0_I2C0RX);


MAP_uDMAChannelAttributeDisable (UDMA_CH0_I2C0RX、
UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);


MAP_uDMAChannelControlSet (UDMA_CH0_I2C0RX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE |
UDMA_DST_INC_8 | UDMA_ARB_1 | UDMA_NEW_USEBURST);


MAP_uDMAChannelTransferSet (UDMA_CH0_I2C0RX | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、(void *)&I2C0->FIFODATA、
(空*)&g_ui8RxBufA、
3);

MAP_uDMAChannelEnable (UDMA_CH0_I2C0RX);
} 

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

    Andy、

    请参阅 MSP432E4 TRM 中的以下部分

    • 19.3.5
    • 19.3.5.2
    • 19.3.6.2

    虽然该示例旨在用于器件充当主器件时、但我建议您还查看 MSP432E4 SDK 中的"i2c_master_dma_fifo"示例。

    BR、

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

    谢谢。 我想我错过了 RXFIFO。 我想 I2CSCSR 是只读的。