20240909-DXSPX-emb/Src/Usr/BSP/BSPSpi.c

86 lines
2.4 KiB
C

#include "BSPSpi.h"
#include <cpu.h>
#include <os.h>
#include <bsp_int.h>
#include <bsp_sys.h>
#include <lib_def.h>
#include <os_cpu.h>
#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;
}
}