#include "BSPSpi.h" #include #include #include #include #include #include #include "BSPSys.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/ssi.h" #include "driverlib/interrupt.h" #include "inc/hw_memmap.h" #include "inc/hw_ssi.h" #include "inc/hw_ints.h" int8_t Bsp_SpiInit(uint8_t spi_id) { INT32U pui32DataRx; switch (spi_id) { case BSP_SPI3: // 初始化GPIO口 SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3); SysCtlPeripheralEnable(SPI3_SYS_PERIPH_GPIO); GPIOPinConfigure(SPI3_GPIO_CLK_CFG); GPIOPinConfigure(SPI3_GPIO_FSS_CFG); GPIOPinConfigure(SPI3_GPIO_RX_CFG); GPIOPinConfigure(SPI3_GPIO_TX_CFG); // 配置SPI初始化的参数 GPIOPinTypeSSI(SPI3_GPIO_BASE, SPI3_GPIO_CLK | SPI3_GPIO_FSS | SPI3_GPIO_RX | SPI3_GPIO_TX ); SSIConfigSetExpClk(SSI3_BASE, BspGetSysClock(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8); // 使能SPI时钟总线 SSIEnable(SSI3_BASE); while(SSIDataGetNonBlocking(SSI3_BASE, &pui32DataRx)); // 清除接收缓冲区 break; } return 0; } uint8_t Bsp_RWByte(uint8_t spi_id, uint8_t data) { uint32_t rec = 0; CPU_SR_ALLOC(); OS_ENTER_CRITICAL(); switch (spi_id) { case BSP_SPI3: while(SSIDataGetNonBlocking(SSI3_BASE, &rec)); // 清除接收缓冲区 SSIDataPut(SSI3_BASE, data); while (SSIBusy(SSI3_BASE)); SSIDataGet(SSI3_BASE, &rec); break; } OS_EXIT_CRITICAL(); return (uint8_t)(rec & 0xff); } void Bsp_SpiSetSpeed(uint8_t spi_id, uint32_t Speed) { switch (spi_id) { case BSP_SPI3: SSIDisable(SSI3_BASE); SSIConfigSetExpClk(SSI3_BASE, BspGetSysClock(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, Speed, 8); SSIEnable(SSI3_BASE); break; } } void Bsp_SpiCS(uint8_t spi_id, uint8_t value) { switch (spi_id) { case BSP_SPI3: GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, value == 1 ? GPIO_PIN_2 : ~ GPIO_PIN_2); // 低电平运行,高电平停止 break; } }