受其他项目的启发,如果IO充裕,且在SPI主机与SPI从机均可以自行编程的情况下,可以尝试在4线SPI的基础上增加两根GPIO线,通过IO中断的形式通知对方进行收数据;
非SPI中断形式,以两颗CH582通讯为例,
1、主机程序:
void main() { SetSysClock(CLK_SOURCE_PLL_60MHz); GPIOA_ModeCfg(GPIO_Pin_0,GPIO_ModeOut_PP_5mA); GPIOA_SetBits(GPIO_Pin_0);//初始化PA0作为输出引脚,默认输出高电平,等到需要发数据时使PA0输出低电平,令对方进行GPIO中断已达到通知对方收数据的目的 GPIOA_ModeCfg(GPIO_Pin_1,GPIO_ModeIN_PU);//配置PA1上拉输入,使能下降沿中断 GPIOA_ITModeCfg(GPIO_Pin_1, GPIO_ITMode_FallEdge); PFIC_EnableIRQ(GPIO_A_IRQn); /* SPI 0 */ GPIOA_SetBits(GPIO_Pin_12); GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA); SPI0_MasterDefInit();//初始化SPI引脚配置,主机模式下PA15默认不需要配置 GPIOA_ResetBits(GPIO_Pin_12);//主机拉低片选线,由于只跟一个设备通讯,这边就一直选中该设备,不再拉高片选线 while(1) { DelayMs(1000);//每秒发一次数据给对方 GPIOA_ResetBits(GPIO_Pin_0);//拉中断线告知对方准备收数据 SPI0_MasterDMATrans(spiBuff, 12); PRINT("send end\n"); GPIOA_SetBits(GPIO_Pin_0);//发送完数据立即拉高PA0 } } __INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void)//对方拉低中断线告知主机准备读数据 { if(GPIOA_ReadITFlagBit(GPIO_Pin_1)) { DelayUs(20);//延迟20us,保证数据已经通过spi线传到主机这边 SPI0_MasterDMARecv(spiBuffrev, 12);//主机接收从机数据 for(uint8_t i = 0; i < 12; i++) { PRINT(" %x", spiBuffrev[i]); } PRINT("\n"); GPIOA_ClearITFlagBit(GPIO_Pin_1); } }主机程序
2、从机程序(与主机配置收发逻辑一致,只有SPI初始化那边有差异)
void main() { SetSysClock(CLK_SOURCE_PLL_60MHz); GPIOA_ModeCfg(GPIO_Pin_1,GPIO_ModeOut_PP_5mA); GPIOA_SetBits(GPIO_Pin_1);//默认输出高电平,有数据需要发送时输出低电平通知主机 GPIOA_ModeCfg(GPIO_Pin_0,GPIO_ModeIN_PU); GPIOA_ITModeCfg(GPIO_Pin_0, GPIO_ITMode_FallEdge); PFIC_EnableIRQ(GPIO_A_IRQn);//默认上拉,等待下降沿中断收数据 /* 设备模式 */ PRINT("1.spi0 mul slave mode \n"); GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU); SPI0_SlaveInit();//SPI引脚初始化及寄存器配置 while(1) { DelayMs(1000); GPIOA_ResetBits(GPIO_Pin_1);//拉中断线告知对方准备收数据 SPI0_SlaveDMATrans(spiBuff, 12); PRINT("send end\n"); GPIOA_SetBits(GPIO_Pin_1); } } __INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void) { if(GPIOA_ReadITFlagBit(GPIO_Pin_0)) { DelayUs(20); SPI0_SlaveDMARecv(spiBuffrev, 12); for(uint8_t i = 0; i < 12; i++) { PRINT(" %x", spiBuffrev[i]); } PRINT("\n"); GPIOA_ClearITFlagBit(GPIO_Pin_0); } }从机配置
3、程序演示效果(左主右从)
标签:CH57x,12,Pin,中断,主机,CH59x,SPI,GPIOA,GPIO From: https://www.cnblogs.com/azou/p/18088820