打开官方的样例库,打开master模式的例程
下面的两份是SPI初始化代码,这边用到的是SPI0,要注意查看库文件中的映射
我手上的KCTA只有64pin,而映射中SPI0给到了PE的SPI映射引脚,这是我手上的芯片所没有的
需要更改board文件中的映射,具体映射是什么引脚查询官方的文档即可
本次用到了A4、A5、A6、A7作为SPI的引脚
修改完映射后,要修改样例库中GPIO初始化的的AF功能复用参数,更改为GpioAf1
/**
******************************************************************************
** \brief 初始化外部GPIO引脚
**
** \return 无
******************************************************************************/
static void App_GpioInit(void)
{
stc_gpio_cfg_t GpioInitStruct;
DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
///< SPI0引脚配置:主机
GpioInitStruct.enDrv = GpioDrvH;
GpioInitStruct.enDir = GpioDirOut;
Gpio_Init(STK_SPI0_CS_PORT, STK_SPI0_CS_PIN, &GpioInitStruct);
Gpio_SetAfMode(STK_SPI0_CS_PORT, STK_SPI0_CS_PIN, GpioAf1); ///<配置SPI0_CS
Gpio_Init(STK_SPI0_SCK_PORT, STK_SPI0_SCK_PIN, &GpioInitStruct);
Gpio_SetAfMode(STK_SPI0_SCK_PORT, STK_SPI0_SCK_PIN, GpioAf1); ///<配置SPI0_SCK
Gpio_Init(STK_SPI0_MOSI_PORT, STK_SPI0_MOSI_PIN, &GpioInitStruct);
Gpio_SetAfMode(STK_SPI0_MOSI_PORT, STK_SPI0_MOSI_PIN, GpioAf1); ///<配置SPI0_MOSI
GpioInitStruct.enDir = GpioDirIn;
Gpio_Init(STK_SPI0_MISO_PORT, STK_SPI0_MISO_PIN, &GpioInitStruct);
Gpio_SetAfMode(STK_SPI0_MISO_PORT, STK_SPI0_MISO_PIN, GpioAf1); ///<配置SPI0_MISO
}
/**
******************************************************************************
** \brief 初始化SPI
**
** \return 无
******************************************************************************/
static void App_SPIInit(void)
{
stc_spi_cfg_t SpiInitStruct;
///< 打开外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE);
///<复位模块
Reset_RstPeripheral0(ResetMskSpi0);
//SPI0模块配置:主机
SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式
SpiInitStruct.enPclkDiv = SpiClkMskDiv128; //波特率:PCLK/2
SpiInitStruct.enCPHA = SpiMskCphafirst; //第一边沿采样
SpiInitStruct.enCPOL = SpiMskcpollow; //极性为低
Spi_Init(M0P_SPI0, &SpiInitStruct);
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
随后在main函数中调用两个初始化函数,再使用库函数开始通讯
切记SPI是交换数据的形式,要在发送的同时读取数据。
我在这里卡了一个早上才回忆过来,读了一个早上的0xFF。
///< 端口初始化
App_GpioInit();
///< SPI初始化
App_SPIInit();
///< 片选,开始通讯
Spi_SetCS(M0P_SPI0, FALSE);
///< 主机向从机发送数据
Spi_SendBuf(M0P_SPI0,&num_temp,1);
Spi_ReceiveBuf(M0P_SPI0, rx_buf, 3);
///< 结束通信
用串口&OLED&其他自己方便的方法,读取rx_buf的数据数据,里面就是falsh的设备ID号了
SPI的交互成立,后面的读写或者和其他设备的基本交互也都是大同小异