HC32L196KCTA的SPI测试(读取W25Q64JV设备ID)

本文详细描述了在KCTA64pin平台上对SPI0进行初始化的过程,涉及GPIO引脚的配置、AF功能复用参数的修改以及SPI的主机模式设置。作者强调了映射调整和数据交换的重要性,特别是处理SPI通信中的读写操作。
摘要由CSDN通过智能技术生成

打开官方的样例库,打开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的交互成立,后面的读写或者和其他设备的基本交互也都是大同小异

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值