请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
我的 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);
}