CH573F,调试SPI从机,功能已经OK,经过IO定向,用在PB口这一组SPI,
我将PA15,用作一个检测输入,配置为上拉,中断,测试到主机访问MCU时,改IO口会误检测。
产生中断信号,实际测量PB口的SPI通讯时,PA15会随着CS信号产生低电平。
硬件确认两个PIN是没有短路的,将PA15悬空,用示波器抓也确定是有干扰。
是否还有什么原因呢问题没有考虑到的呢?
下图为MCU的SPI初始化。
//SPI0 初始化
void userSPI0Init(void)
{
//PRINT( "SPI0 Initn");
GPIOPinRemap( ENABLE, RB_PIN_SPI0 );//SPI0重映射到PB口
GPIOB_ModeCfg( GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_Floa
ting );
SPI0_SlaveInit();
SetFirstData(0xA5);
SPI0_ITCfg( ENABLE, RB_SPI_IE_FST_BYTE);
PFIC_EnableIRQ( SPI0_IRQn );
R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;//关闭DMA
spiSendData.u32Data = 0;
}
//SPI0 中断服务函数
//调试pritf时,要主要主机时钟不要太快。
__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_%02Xn", temp);
SPI0_ClearITFlag(RB_SPI_IF_FST_BYTE);//重置首字节接收中断标记
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
SPI0_ITCfg( ENABLE, RB_SPI_IE_BYTE_END);//启用字节传输完成中断
rwFlag = (UINT8)(temp&0x80?MCU_CMD_READ:MCU_CMD_WRITE);
recCMD = (UINT8)(temp&0x7f);
if(rwFlag == MCU_CMD_READ)//读指令,即将进入发送模式
{
SendOrRecvMode = SEND_MODE;
readCommandProcess(recCMD);//刷新spiSendBuff内容4个字节。
GPIOB_ModeCfg(SPI_MISO_PIN, GPIO_ModeOut_PP_5mA);//配置MISO发送
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; //配置FIFO方向为发送
rCnt = 0;
R8_SPI0_FIFO = spiSendData.u8Buff[rCnt];
//PRINT("S_%d %02Xn", rCnt, R8_SPI0_FIFO);
rCnt++;
}
else
{
rCnt = 0;
//PRINT("SPI_Rn");
}
}
else if(SPI0_GetITFlag(RB_SPI_IF_BYTE_END))//接收完单个字节
{
if(rCnt < SPI_BUFF_LEN)
{
recOK = 1;
spiRecData.u8Buff[rCnt] = (UINT8)(R8_SPI0_BUFFER);
//PRINT("R = %02Xn", spiRecData.u8Buff[rCnt]);
rCnt++;
}
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
}
}
else//指令已经成立,发送模式
{
if(SPI0_GetITFlag(RB_SPI_IF_BYTE_END))//接收完单个字节
{
R8_SPI0_FIFO = spiSendData.u8Buff[rCnt];
//PRINT("S_%d %02Xn", rCnt, R8_SPI0_FIFO);
rCnt++;
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
}
}
}