工具/软件:TI C/C++编译器
您好、PAL、
我设置10个 I2C 外设 (I2C0~9)来读取/写入数据、并再次遇到硬故障。
如果我在 I2C3 & I2C4 &I2C7上禁用或更改为 FIFO、则该功能没有问题。
请查看我的代码并提供建议、谢谢。
int main (空)
{
// uint16_t 反转;
//uint32_t uiLoopTest=0;
volatile uint32_t ui32Boot = 0;
uint8_t nPntCnt=25、nPntCnt2=26、nMaxPntCnt=0;
uint8_t nPalmCnt=30、nPalmCnt2=31、nMaxPalmCnt=0;
uint8_t i;
G_Shotscope = 1;
#ifdef TI_Board
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
其他
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_12MHz|)
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
#endif
//GPIO 端口功能初始化
PortFunctionInit();
#ifdef TI_Board
ConfigureDBGUART (3、115200);//无法使用端口0,uart0与 I2C9冲突
其他
ConfigureDBGUART (2、115200);//无法使用端口0,uart0与 I2C9冲突
#endif
UARTprintf ("配置__________________ 好的!!!!!!!!!);
PowerOnEnable();
I2C_InitialAll (I2C_EN);
I2C_DMAInitialAll (I2C_DMA_EN);
//#define SLAVE_0_EN 0x0001
//#define SLAVE_1_EN 0x0002
//#define SLAVE_2_EN 0x0004
//#define SLAVE_3_EN 0x0008
//#define SLAVE_4_EN 0x0010
//#define SLAVE_5_EN 0x0020
//#define SLAVE_6_EN 0x0040
//#define SLAVE_7_EN 0x0080
//#define SLAVE_8_EN 0x0100
//#define SLAVE_9_EN 0x0200
//#define I2C_EN (0x3FF) //-->如果定义为0x367,则函数正常
//#define I2C_DMA_EN (0x3FF) //-->如果定义为0x367,则函数正常
I2CMaster_Speed (I2C_SPED_400K);
vfDelay_ms (1);
Flash_Test();
while (1){};
}
void I2C_InitialAll (uint16_t u16MaskCH)
{
uint8_t i;
对于(i=0;i<10;i++)
{
if (u16MaskCH &(1 <<I))
{
SysCtlPeripheralDisable (I2C_Periph[i]);
SysCtlPeripheralReset (I2C_Periph[i]);
SysCtlPeripheralEnable (I2C_Periph[i]);
while (!SysCtlPeripheralReady (I2C_Periph[i]));
GPIOPinTypeI2C (I2C_PIN_BASI[i]、I2C_SDA_PIN[i]);
GPIOPinTypeI2CSCL (I2C_PIN_BASI[i]、I2C_SCL_PIN[i]);
GPIOPinConfigure (I2C_SDA[i]);
GPIOPinConfigure (I2C_SCL[i]);
HWREG (I2C_PIN_BAS[i]+ GPIO_PUR)=(I2C_SDA_PIN[i]|I2C_SCL_PIN[i]);
I2CRxFIFOConfigSet (I2C_BASE_[i]、(I2C_FIFO_CFG_RX_MASTER_DMA | I2C_FIFO_CFG_RX_TRIG_8));
I2CTxFIFOConfigSet (I2C_BASE]、(I2C_FIFO_CFG_TX_MASTER_DMA);
I2CRxFIFOFlush (I2C_BASE_I]);
I2CTxFIFOFlush (I2C_BASE_I]);
I2CMInit (&g_sI2CMInst[i]、I2C_BASE[i]、I2C_INT[i]、0xff、0xff、 G_ui32SysClock、1);
I2CIntRegister (I2C_base[i]、pISRHandler[i]);
}
}
#if 0
IF (SLAVE_3_EN 和 u16MaskCH)
{
I2CRxFIFOConfigSet (I2C_BASE_3]、I2C_FIFO_CFG_RX_MASTER);
I2CTxFIFOConfigSet (I2C_BASE]、I2C_FIFO_CFG_TX_MASTER);
}
IF (SLAVE_4_EN 和 u16MaskCH)
{
I2CRxFIFOConfigSet (I2C_BASE_4]、I2C_FIFO_CFG_RX_MASTER);
I2CTxFIFOConfigSet (I2C_BASE_4]、I2C_FIFO_CFG_TX_MASTER);
}
IF (SLAVE_5_EN 和 u16MaskCH)
{
I2CRxFIFOConfigSet (I2C_base[5]、I2C_FIFO_CFG_RX_MASTER);
I2CTxFIFOConfigSet (I2C_BASE]、I2C_FIFO_CFG_TX_MASTER);
}
IF (SLAVE_7_EN 和 u16MaskCH)
{
I2CRxFIFOConfigSet (I2C_base[7]、I2C_FIFO_CFG_RX_MASTER);
I2CTxFIFOConfigSet (I2C_base[7]、I2C_FIFO_CFG_TX_MASTER);
}
其他
IF (SLAVE_5_EN 和 u16MaskCH)
{
I2CRxFIFOConfigSet (I2C_base[5]、I2C_FIFO_CFG_RX_MASTER);
I2CTxFIFOConfigSet (I2C_BASE]、I2C_FIFO_CFG_TX_MASTER);
}
#endif
}
void I2C_DMAInitialAll (uint16_t u16MaskCH)
{
uint8_t i;
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA);
IntEnable (INT_UDMAERR);
uDMAEnable();
uDMAControlBaseSet (pui8ControlTable);
IntEnable (INT_UDMA);
对于(i=0;i<10;i++)
{
#if 0
if (u16MaskCH &(1 << i)&&(i!= 3)&&(i!=4)&&(i!=5)&&(i!=7))//if (u16MaskCH &(1 << i)&&(i!= 5))
其他
if (u16MaskCH &(1 << I)&&(I!= 5))
#endif
{
uDMAChannelAssign (DMA_I2CTX[i]);
uDMAChannelAttributeDisable (DMA_I2CTX[i]、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR_UDMA_ATTR_REQMASK);
uDMAChannelControlSet (DMA_I2CTX[i]| UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARC_4);
uDMAChannelAssign (DMA_I2CRX[i]);
uDMAChannelAttributeDisable (DMA_I2CRX[i]、
UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |(UDMA_ATTR_HIGH_PRIOR_UDMA_ATTR_REQMASK);
uDMAChannelControlSet (DMA_I2CRX[i]| UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARC_4);
//uDMAIntRegister
}
}
}
void I2C_DMAWriteAll (uint16_t u16MaskCH、uint8_t (* pu8TxBuffer)[200]、uint16_t u16Len)
{
uint8_t u8CH;
uint16_t u16Freed=0、u16cnt=0;
// DMA 设置===================================================================================================================
对于(u8ch=0;u8ch<10;u8ch++)
{
#if 0
if (u16MaskCH &(1 << u8CH)&&(u8CH!= 3)&&(u8CH!= 4)&&(u8CH!= 5)&&(u8CH!= 7))
其他
if ((u16MaskCH &(1<<u8CH)) && (u8CH != 5))
#endif
{
I2CMasterSlaveAddrSet (I2C_base[u8ch]、I2C_SLAVE_ADDR、false);
uDMAChannelTransferSet (DMA_I2CTX[u8CH]| UDMA_PRI_SELECT、UDMA_MODE_BASIC、
pu8TxBuffer[u8ch]、((void *)(I2C_base[u8ch]+ I2C_O_FIFODATA)、u16Len);
uDMAChannelEnable (DMA_I2CTX[u8CH]);
I2CMasterBurstLengthSet (I2C_base[u8ch]、u16Len);
}
}
// DMA star ========================================================================================================================================
对于(u8ch=0;u8ch<10;u8ch++)
{
#if 0
if (u16MaskCH &(1 << u8CH)&&((u8CH!= 3)&&(u8CH!= 4)&&(u8CH!= 5)&&(u8CH!= 7))//
其他
if ((u16MaskCH &(1<<u8CH)) && (u8CH != 5))
#endif
I2CMasterControl (I2C_base[u8ch]、I2C_MASTER_CMD_FIFO_SINGLE_SEND);
}
SysCtlDelay (1000);
//I2C5 START ================================================================================================================================================================================================================
#if 0
if ((SLAVE_3_EN 和 u16MaskCH)|(SLAVE_4_EN 和 u16MaskCH)|(SLAVE_5_EN 和 u16MaskCH)|(SLAVE_7_EN 和 u16MaskCH))//IF (SLAVE_5_EN 和 u16MaskCH)
{
// I2C_Write (I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len);
// //I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
// while (I2CMasterBusy (I2C_base[5]));
IF (SLAVE_3_EN 和 u16MaskCH)
{
I2C_Write (3、I2C_SLAVE_ADDR、pu8TxBuffer[3]、u16Len);
}
IF (SLAVE_4_EN 和 u16MaskCH)
{
I2C_Write (4、I2C_SLAVE_ADDR、pu8TxBuffer[4]、u16Len);
}
IF (SLAVE_5_EN 和 u16MaskCH)
{
I2C_Write (5、I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len);
}
IF (SLAVE_7_EN 和 u16MaskCH)
{
I2C_Write (7、I2C_SLAVE_ADDR、pu8TxBuffer[7]、u16Len);
}
IF (SLAVE_3_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[3]));
}
IF (SLAVE_4_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[4]));
}
IF (SLAVE_5_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[5]));
}
IF (SLAVE_7_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[7]));
}
}
其他
IF (SLAVE_5_EN 和 u16MaskCH)
{
I2C_Write (5、I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len); <--***** 在调试模式下卡在这里****
//I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
while (I2CMasterBusy (I2C_base[5]));
}
#endif
//等待总线空闲===========================================================================================
while (u16Cnt<5000)
{
SysCtlDelay (1000);
u16Cnt++;
对于(u8ch=0;u8ch<10;u8ch++)
{
if ((u16MaskCH &(1<<u8CH)) && (I2CMasterBusy(I2C_BASE[u8CH]) == false))
u16Free |=(1 << u8CH);
}
if (u16MaskCH = u16Free)
中断;
}
if (u16cnt = 5000)
UARTprintf ("\n 写入错误!!!!");
}
void I2C_DMAReadAll (uint16_t u16MaskCH、uint8_t (* pu8RxBuffer)[200]、uint16_t u16Len)
{
uint8_t u8CH;
uint16_t u16Freed=0、u16cnt=0;
// DMA 设置===================================================================================================================
对于(u8ch=0;u8ch<10;u8ch++)
{
IF (u16MaskCH &(1<<u8CH) && (u8CH != 5))
{
I2CMasterSlaveAddrSet (I2C_base[u8ch]、I2C_SLAVE_ADDR、true);
I2CMasterBurstLengthSet (I2C_base[u8ch]、u16Len);
uDMAChannelTransferSet (DMA_I2CRX[u8CH]| UDMA_PRI_SELECT、UDMA_MODE_BASIC、
((void *)(I2C_base[u8ch]+ I2C_O_FIFODATA)、pu8RxBuffer[u8ch]、u16Len);
uDMAChannelEnable (DMA_I2CRX[u8CH]);
}
}
// DMA star ========================================================================================================================================
对于(u8ch=0;u8ch<10;u8ch++)
{
#if 0
if (u16MaskCH &(1 << u8CH)&&((u8CH!= 3)&&(u8CH!= 4)&&(u8CH!= 5)&&(u8CH!= 7)))
其他
IF (u16MaskCH &(1<<u8CH) && (u8CH != 5))
#endif
I2CMasterControl (I2C_base[u8ch]、I2C_MASTER_CMD_FIFO_SINGLE_Receive);
}
//I2C5 START ================================================================================================================================================================================================================
// if (slave_5_EN 和 u16MaskCH)
// {
// I2C_Read (I2C_SLAVE_ADDR、pu8RxBuffer[5]、u16Len);
// while (I2CMasterBusy (I2C_base[5]));
// }
#if 0
if ((SLAVE_3_EN 和 u16MaskCH)|(SLAVE_4_EN 和 u16MaskCH)|(SLAVE_5_EN 和 u16MaskCH)|(SLAVE_7_EN 和 u16MaskCH))//IF (SLAVE_5_EN 和 u16MaskCH)
{
// I2C_Write (I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len);
// //I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
// while (I2CMasterBusy (I2C_base[5]));
IF (SLAVE_3_EN 和 u16MaskCH)
{
I2C_Read (3、I2C_SLAVE_ADDR、pu8RxBuffer[3]、u16Len);
}
IF (SLAVE_4_EN 和 u16MaskCH)
{
I2C_Read (4、I2C_SLAVE_ADDR、pu8RxBuffer[4]、u16Len);
}
IF (SLAVE_5_EN 和 u16MaskCH)
{
I2C_Read (5、I2C_SLAVE_ADDR、pu8RxBuffer[5]、u16Len);
}
IF (SLAVE_7_EN 和 u16MaskCH)
{
I2C_Read (7、I2C_SLAVE_ADDR、pu8RxBuffer[7]、u16Len);
}
IF (SLAVE_3_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[3]));
}
IF (SLAVE_4_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[4]));
}
IF (SLAVE_5_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[5]));
}
IF (SLAVE_7_EN 和 u16MaskCH)
{
while (I2CMasterBusy (I2C_base[7]));
}
}
其他
IF (SLAVE_5_EN 和 u16MaskCH)
{
I2C_Read (5、I2C_SLAVE_ADDR、pu8RxBuffer[5]、u16Len);
//I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
while (I2CMasterBusy (I2C_base[5]));
}
#endif
//等待总线空闲===========================================================================================
while (u16Cnt<5000)
{
SysCtlDelay (1000);
u16Cnt++;
对于(u8ch=0;u8ch<10;u8ch++)
{
if ((u16MaskCH &(1<<u8CH)) && (I2CMasterBusy(I2C_BASE[u8CH]) == false))
u16Free |=(1 << u8CH);
}
if (u16MaskCH = u16Free)
中断;
}
if (u16cnt = 5000)
UARTprintf ("\n 报错!!!!");
}
void Flash_Test (void)
{
uint8_t u8i;
uint8_t data[5];
//进入串行调试模式
数据[0]= 0x53;
数据[1]= 0x45;
DATA[2]= 0x52;
数据[3]= 0x44;
DATA[4]= 0x42;
for (u8i=0;u8i<10;u8i++)
{
if (I2C_EN&(1<<u8i))
{
memcpy (&(gau8TxBuf[u8i][0])、data、sizeof (data));
}
}
I2C_DMAWriteAll (I2C_EN、Gau8TxBuf、5);
delay_1ms ();
}