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.

[参考译文] I2C DMA 读取硬故障

Guru**** 2463330 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/659477/hard-fault-from-i2c-dma-read

主题中讨论的其他器件:TM4C1294NCPDT

我可以传输 I2C Tx (DMAWrite)、并看到缓冲器已被逻辑分析仪发送和应答、但从   I2C Rx (DMARead)接收时出现故障。

请帮助我查看详细信息、下面是 FYI、谢谢。

//主流
uint32_t u32Loop;
for (u32Loop = 0;u32Loop < 32;u32Loop +)
{

}

map_SysCtlPeripheralEnable (sysctl_Periph_GPIOQ);
map_GPIOPinTypeGPIOInput (PACKAGESEL_PIN_BASE、PACKAGESEL_AGPGEL
、GPIOPESPHIN);MAP_AGPGEL 和 GPIOPESPIN_AGPIN_BASE;GPIOPEN_AGESPIN_AGPIN_AGP= GPIOPEN_AGP= GPIOPIN_AGP= GPIOPEN_BASE GPIO_Strength _4mA、GPIO_PIN_TYPE_STD_WPU);

g_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_12MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

// GPIO 端口函数 init
PortFunctionInit();

#ifdef debug
//#message "此代码将运行调试模式。"
ConfigureDBGUART();
#else
ConfigureCDCUART();
#endif

debug_print ("ConfigureGPIO\n");
ConfigureGPIO();

I2CDMAInitial();
I2C0_initial (0x41);
gu8TxBuf[0]= 20;
I2C0_DMAWrite (gu8TxBuf、32);
I2C0_DMARead (gu8RxBuf、 32);//此处为硬故障 
// 
void I2CDMAInitial(void) { SysCtlPeripheralEnable (sysctl_Periph_UDMA); SysCtlPeripheralSleep Enable (sysctl_Periph_UDMA); IntEnable (INT_UDMAERR); uDMAEnable(); uDMAControlBaseSet (pui8ControlTable); 启用(INT_UDMA); uDMAChannelAssign (UDMA_CH1_I2C0TX); uDMAChannelMASTDISABLE (UDMA_CH1_I2C0TX、 UDMA_ATTR_ALTSELECT);uDMA_ATTR_ATTR_USEBURST | UCCTR_HIGH_PRIOR_ENTRY_UCC0_UDMA_UCCR8_UDMA_LD_UDMA_LD_UCCR8_UDMA_LD_UCCR8_UDMA_LD_UCCTR_UCCR_UCC_UTR_UTR_UCCR_UCC_UTR_TR_UCC_TR_UCC_TR_UTR_UTR_TR_UTR_UTR_UTR_UTR_TR_UTR_UTR_TR_TR_UTR_UCC_UTR_TR_UCC_TR_TR_UTR_UCC_0 ;UCC_UCC_TR_TR_TR_TR_TR_UTR_UTR_UTR_UTR_U uDMAChannelControlSet (UDMA_CH3_I2C1TX | UDMA_PRI_SELECT、 UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_4); uDMAChannelAssign (UDMA_CH2_I2RX_UDMA_LDCC_4);uDMA_LDCC_UDMA_LDCC_UCC_4 | UDMA_LDCC_R_UDMA_RESTR_UCC_4 | UDMA_LD_UDMA_RESTR_UDMA_LD_UCCTR_UCC_4 | UDMA_LD_ADC_ADC_ADAP_R_UCC_ADC_ADAP_4 | UDMA_LD_R_UCC_R_UCC_TR_ADC_ADC_ADAP_ADAP_ADAP_ADAP_4 | UCC_LD_LD_ADAP_R_UCC_TR_TR_UCC_ADC_ADAP_ADAP_R_ADAP
void I2C0_DMAWrite (uint8_t * pu8TxBuffer、uint16_t u16Len)
{
uDMAChannelTransferSet (UDMA_CH1_I2C0TX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、
pu8TxBuffer、(void *)(I2C00_I2C0TX + UDC_BASE)



;UDC26_I2T_I2THRESHO_I2_I2UCAST_L0;UCAST_I2UCAST_L0 (UCAST_I2THRESHOT_UDC_BASE)
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_FIFO_SINGLE_SEND);
}

void I2C0_DMARead (uint8_t * pu8RxBuffer、uint16_t u16Len)
{
uDMAChannelTransferSet (UDMA_CH0_I2RX | UDP0_RxBuffer、uint16_t UCC0_RAT_BASIC
)}(uTS_UCC0_UCC0_UDC0_RAT_RAT_BASIC)、UCCR0 (u_UCCR0)+ UDCO (u_UCCR0) UCCR0 (u_UDC_UDC_RAT_BASIC)、UCCR0 (u_UDC



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

    您能否提供有关您所使用的 TI 产品的更多详细信息?

    谢谢
    Bill
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    TM4C1294NCPDT、谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我修改了 DMADWrite & DMARead 函数。
    最后、我可以单独执行 DMADwrite 或 DMARead、但在执行 DMADWrite + DMARead 时仍然存在硬故障...
    对此是否有任何建议?

    空 I2C0_DMAWrite (uint8_t * pu8TxBuffer、uint16_t u16Len)

    uint32_t u32Status;
    if (uDMAChannelModeGet (UDMA_CH1_I2C0TX)= UDMA_MODE_STOP)

    I2CMasterSlaveAddrSet (I2C0_BASE、0x41、false);
    uDMAChannelTransferSet (UDMA_CH1_I2C0TX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、
    pu8TxBuffer、((void *)(I2C0_BASE + I2C_O_FIFODATA)、u16Len);

    uDMAChannelEnable (UDMA_CH1_I2C0TX);

    I2CMasterBurstLengthSet (I2C0_BASE、u16Len);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_FIFO_SINGLE_SEND);

    while (I2CMasterBusy (I2C0_BASE));


    void I2C0_DMARead (uint8_t * pu8RxBuffer、uint16_t u16Len)

    if (uDMAChannelModeGet (UDMA_CH0_I2C0RX)= UDMA_MODE_STOP)

    //
    I2CMasterSlaveAddrSet (I2C0_BASE、0x41、1);
    I2CMasterBurstLengthSet (I2C0_BASE、u16Len);
    uDMAChannelTransferSet (UDMA_CH0_I2C0RX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、
    ((void *)(I2C0_BASE + I2C_O_FIFODATA))、pu8RxBuffer、u16Len);
    //(((void *)(I2C0_BASE + I2C_O_MDR))、pu8RxBuffer、u16Len);
    uDMAChannelEnable (UDMA_CH0_I2C0RX);
    //I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_FIFO_BURST_Receive_start);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_FIFO_SINGLE_Receive);

    while (I2CMasterBusy (I2C0_BASE));
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    除非你已经在其他地方启用了 I2C0、否则我在你的代码中看不到 SysCtlPeripheralEnable (SYSCTL_Periph_I2C0)。 如果您未启用 I2C、则访问 I2C 可能会产生故障。