当前位置: 首页 > news >正文

STM32 模拟SPI 模式0

SPI 模式 0 的时钟极性(CPOL)为 0,时钟相位(CPHA)为 0。CPOL = 0 意味着时钟信号空闲时为低电平,CPHA = 0 表示在时钟信号的第一个跳变沿(上升沿)进行数据采样。

#include "stm32f10x.h"

// 定义SPI引脚
#define SPI_SCK_PIN GPIO_Pin_5
#define SPI_MISO_PIN GPIO_Pin_6
#define SPI_MOSI_PIN GPIO_Pin_7
#define SPI_CS_PIN GPIO_Pin_4
#define SPI_GPIO_PORT GPIOA

// 初始化SPI引脚
void SoftwareSPI_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置SCK和MOSI为推挽输出
    GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN | SPI_MOSI_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SPI_GPIO_PORT, &GPIO_InitStructure);

    // 配置MISO为浮空输入
    GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(SPI_GPIO_PORT, &GPIO_InitStructure);

    // 配置CS为推挽输出
    GPIO_InitStructure.GPIO_Pin = SPI_CS_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SPI_GPIO_PORT, &GPIO_InitStructure);

    // 使能CS
    GPIO_SetBits(SPI_GPIO_PORT, SPI_CS_PIN);
    // 空闲时SCK为低电平
    GPIO_ResetBits(SPI_GPIO_PORT, SPI_SCK_PIN);
}

// 发送一个字节数据
uint8_t SoftwareSPI_SendByte(uint8_t byte) {
    uint8_t i;
    uint8_t receivedByte = 0;

    for (i = 0; i < 8; i++) {
        // 设置MOSI引脚状态
        if (byte & 0x80) {
            GPIO_SetBits(SPI_GPIO_PORT, SPI_MOSI_PIN);
        } else {
            GPIO_ResetBits(SPI_GPIO_PORT, SPI_MOSI_PIN);
        }

        // 拉高时钟信号,产生上升沿
        GPIO_SetBits(SPI_GPIO_PORT, SPI_SCK_PIN);

        // 读取MISO引脚状态(上升沿采样)
        receivedByte <<= 1;
        if (GPIO_ReadInputDataBit(SPI_GPIO_PORT, SPI_MISO_PIN)) {
            receivedByte |= 0x01;
        }

        // 拉低时钟信号
        GPIO_ResetBits(SPI_GPIO_PORT, SPI_SCK_PIN);

        // 移动到下一位
        byte <<= 1;
    }

    return receivedByte;
}

// 主函数示例
int main(void) {
    SoftwareSPI_Init();

    // 使能CS
    GPIO_ResetBits(SPI_GPIO_PORT, SPI_CS_PIN);

    // 发送一个字节数据
    uint8_t sentByte = 0xAA;
    uint8_t receivedByte = SoftwareSPI_SendByte(sentByte);

    // 禁用CS
    GPIO_SetBits(SPI_GPIO_PORT, SPI_CS_PIN);

    while (1) {
        // 主循环
    }
}   

相关文章:

  • 大模型+知识图谱:赋能知识智能新升级
  • Harmony OS【获取本地json数据的方法】
  • 【el-upload】el-upload组件 - list-type=“picture“ 时,文件预览展示优化
  • dfs(二十)257. 二叉树的所有路径
  • /proc/[pid]/maps介绍和pmap介绍、RSS
  • 《深入理解 TypeScript:函数类型与泛型全解析》(万字长文)
  • 【MyDB】5-索引管理之 1-索引管理思路概览
  • Centos7配置本地yum源
  • 大白话读懂java对象创建的过程
  • 织梦DedeCMS数据库表说明大全
  • django入门教程之request和reponse【二】
  • Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(六)
  • 联想拯救者触摸板会每次开机都自动关闭、联想笔记本触摸板关闭、笔记本电脑触摸板自动关闭的解决方法
  • 演员马晓琳正式加入创星演员出道计划,开启演艺事业新篇章
  • 基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统
  • @maptalks/gl-layers中的VectorTileLayer的setStyle属性的全部line配置
  • 群体智能优化算法-模拟退火优化算法(Simulated Annealing, SA,含Matlab源代码)
  • 前端Tailwind CSS面试题及参考答案
  • 实时时钟芯片HYM1381的使用(51单片机)
  • 在K8S中挂载 Secret 到 Pod
  • 下辖各区密集“联手”,南京在下一盘什么样的棋?
  • 全国林业院校校长论坛举行,聚焦林业教育的创新与突破
  • 工人日报:应对“职场肥胖”,健康与减重同受关注
  • 《制止滥用行政权力排除、限制竞争行为规定(修订草案征求意见稿)》公开征求意见
  • 媒体评欧阳娜娜遭民进党当局威胁:艺人表达国家认同是民族大义
  • 政企共同发力:多地密集部署外贸企业抢抓90天政策窗口期