CH573F,調(diào)試SPI從機(jī),功能已經(jīng)OK,經(jīng)過(guò)IO定向,用在PB口這一組SPI,
我將PA15,用作一個(gè)檢測(cè)輸入,配置為上拉,中斷,測(cè)試到主機(jī)訪問(wèn)MCU時(shí),改IO口會(huì)誤檢測(cè)。
產(chǎn)生中斷信號(hào),實(shí)際測(cè)量PB口的SPI通訊時(shí),PA15會(huì)隨著CS信號(hào)產(chǎn)生低電平。
硬件確認(rèn)兩個(gè)PIN是沒(méi)有短路的,將PA15懸空,用示波器抓也確定是有干擾。
是否還有什么原因呢問(wèn)題沒(méi)有考慮到的呢?
下圖為MCU的SPI初始化。
//SPI0 初始化
void userSPI0Init(void)
{
//PRINT( "SPI0 Init\n");
GPIOPinRemap( ENABLE, RB_PIN_SPI0 );//SPI0重映射到PB口
GPIOB_ModeCfg( GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_Floating );
SPI0_SlaveInit();
SetFirstData(0xA5);
SPI0_ITCfg( ENABLE, RB_SPI_IE_FST_BYTE);
PFIC_EnableIRQ( SPI0_IRQn );
R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;//關(guān)閉DMA
spiSendData.u32Data = 0;
}
//SPI0 中斷服務(wù)函數(shù)
//調(diào)試pritf時(shí),要主要主機(jī)時(shí)鐘不要太快。
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void SPI0_IRQHandler(void)
{
UINT8 temp;
if(SendOrRecvMode == RECEIVE_MODE)//接收模式
{
if(SPI0_GetITFlag(RB_SPI_IF_FST_BYTE))
{
temp = (UINT8)(R8_SPI0_BUFFER);
//PRINT("CMD_%02X\n", temp);
SPI0_ClearITFlag(RB_SPI_IF_FST_BYTE);//重置首字節(jié)接收中斷標(biāo)記
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
SPI0_ITCfg( ENABLE, RB_SPI_IE_BYTE_END);//啟用字節(jié)傳輸完成中斷
rwFlag = (UINT8)(temp&0x80?MCU_CMD_READ:MCU_CMD_WRITE);
recCMD = (UINT8)(temp&0x7f);
if(rwFlag == MCU_CMD_READ)//讀指令,即將進(jìn)入發(fā)送模式
{
SendOrRecvMode = SEND_MODE;
readCommandProcess(recCMD);//刷新spiSendBuff內(nèi)容4個(gè)字節(jié)。
GPIOB_ModeCfg(SPI_MISO_PIN, GPIO_ModeOut_PP_5mA);//配置MISO發(fā)送
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; //配置FIFO方向?yàn)榘l(fā)送
rCnt = 0;
R8_SPI0_FIFO = spiSendData.u8Buff[rCnt];
//PRINT("S_%d %02X\n", rCnt, R8_SPI0_FIFO);
rCnt++;
}
else
{
rCnt = 0;
//PRINT("SPI_R\n");
}
}
else if(SPI0_GetITFlag(RB_SPI_IF_BYTE_END))//接收完單個(gè)字節(jié)
{
if(rCnt < SPI_BUFF_LEN)
{
recOK = 1;
spiRecData.u8Buff[rCnt] = (UINT8)(R8_SPI0_BUFFER);
//PRINT("R = %02X\n", spiRecData.u8Buff[rCnt]);
rCnt++;
}
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
}
}
else//指令已經(jīng)成立,發(fā)送模式
{
if(SPI0_GetITFlag(RB_SPI_IF_BYTE_END))//接收完單個(gè)字節(jié)
{
R8_SPI0_FIFO = spiSendData.u8Buff[rCnt];
//PRINT("S_%d %02X\n", rCnt, R8_SPI0_FIFO);
rCnt++;
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
}
}
}