使用0518芯片的SPI0中断来实现0518芯片模块作为Slave方,使用SPI0接口来接收打印“Master方”发送过来的一个字节数据。
1、SPI0中断处理以及初始化相关源码如下:
uint32_t u32RecvData_spi = 0; // void SPI0_IRQHandler(void) { /* Check RX EMPTY flag */ while(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI0) == 0) { /* Read RX FIFO */ u32RecvData_spi = SPI_READ_RX(SPI0); printf("%X\n", u32RecvData_spi); } /* Check TX FULL flag and TX data count */ while((SPI_GET_TX_FIFO_FULL_FLAG(SPI0) == 0)) { /* Write to TX FIFO */ SPI_WRITE_TX(SPI0, 0); //用0x00填满FIFO的TX缓存区。 } /* Check the RX FIFO time-out interrupt flag */ if(SPI_GetIntFlag(SPI0, SPI_FIFO_TIMEOUT_INT_MASK)) { /* If RX FIFO is not empty, read RX FIFO. */ while(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI0) == 0) u32RecvData_spi = SPI_READ_RX(SPI0); printf("3\n"); } } void SPI0_Init(void) { SPI_Open(SPI0, SPI_SLAVE, SPI_MODE_0, 8, NULL); //SPI_SET_LSB_FIRST(SPI0);// //SPI_SET_SUSPEND_CYCLE(SPI0, 16); //SPI_SET_DATA_WIDTH(SPI0, 24); //SPI_SET_LSB_FIRST(SPI0); //SPI_DISABLE_BYTE_REORDER(SPI0); //SPI_ENABLE_BYTE_REORDER(SPI0); //SPI_DISABLE_DUAL_MODE(SPI0); //SPI_ENABLE_3WIRE_MODE(SPI0); /* Enable TX FIFO threshold interrupt and RX FIFO time-out interrupt */ SPI_EnableInt(SPI0, SPI_FIFO_TX_INT_MASK | SPI_FIFO_TIMEOUT_INT_MASK); NVIC_EnableIRQ(SPI0_IRQn); SPI_EnableFIFO(SPI0, 0, 0); //开启FiFo模式,这个很重要。 }
2、在SYS_Init()中,需要使能相关的IP时钟:
CLK_EnableModuleClock(SPI0_MODULE); CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk); //外部晶振 //CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_PLL, MODULE_NoMsk); //内部晶振
3、记得在main()中,调用一下 SPI0_Init();不然没有作用的。 --- VIP here。
---- The End.
来源:51CTO
作者:JimmyHoo0000
链接:https://blog.csdn.net/qq_41811438/article/details/100736416