文章目录

  • 作业内容
  • 思路分析
    • 电路图分析
    • 通信协议
    • RCC章节分析
    • GPIO章节分析
  • 代码实现
    • spi.h
    • spi.c
    • main.c
  • 实验结果

作业内容

完成SPI实验:实现数码晶体管显示相应数字

思路分析

电路图分析



通信协议

  1. 起始信号:NSS信号线由高变低,是SPI通讯的起始信号
  2. 结束信号:NSS信号线由低变高,是SPI通讯的停止信号
  3. 数据传输:SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。

RCC章节分析

设置GPIOE清除寄存器使能:RCC_MP_AHB4ENCLRR[4] = 1

GPIO章节分析

  1. 设置PE11、PE12、PE14引脚为输出模式,PE13引脚为输入模式
  2. 设置PE11、PE12、PE14引脚为推挽输出
  3. 设置输出速度为超高速
  4. 设置禁止上下拉

代码实现

spi.h

#ifndef __SPI_H__
#define __SPI_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
// MOSI对应的引脚输出高低电平的信号
#define  MOSI_OUTPUT_H()    do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define  MOSI_OUTPUT_L()    do{GPIOE->ODR &= (~(0x1 << 14));}while(0)// 对应595芯片的锁存引脚输出高低电平
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)// 时钟信号对应的引脚输出高低电平
#define  SCK_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 12);}while(0)
#define  SCK_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 12));}while(0)/** 函数功能: SPI初始化函数,推挽输出,高速,禁止上拉和下拉* 函数参数:无* 函数返回值:无
*/
void SPI_init(void);
/** 函数功能:SPI发送数据的函数* 函数参数:dat : 要发送的数据* 函数返回值:无*
*/
void SPI_write(unsigned char dat);#endif  // __SPI_H__

spi.c

#include "spi.h"
/* SPI4_NSS     ---->   PE11* SPI4_SCK     ---->   PE12* SPI4_MOSI    ---->   PE14* SPI4_MISO    ---->   PE13* *//* 数码管的编码, 先发送低位,在发送高位* A B C D E F G DP* 1 1 1 1 1 1 0 0    0xFC   0* 0 1 1 0 0 0 0 0    0x60   1* 1 1 0 1 1 0 1 0    0xDA   2* 1 1 1 1 0 0 1 0    0xF2   3* 0 1 1 0 0 1 1 0    0x66   4* 1 0 1 1 0 1 1 0    0xB6   5 * 1 0 1 1 1 1 1 0    0xBE   6* 1 1 1 0 0 0 0 0    0xE0   7* 1 1 1 1 1 1 1 0    0xFE   8* 1 1 1 1 0 1 1 0    0xF6   9* */
void delay_us1(unsigned int us)
{int i,j;for(i = 0; i < us;i++)for (j = 0; j < 1;j++);
}void SPI_init(void)
{RCC->MP_AHB4ENSETR |= (0x1 << 4);// MOSI    PE14 GPIOE->MODER &= (~(0x3 << 28));GPIOE->MODER |= (0x1 << 28);GPIOE->OTYPER &= (~(0x1 << 14));GPIOE->OSPEEDR &= (~(0x3 << 28));
//  GPIOE->OSPEEDR |= (0x2 << 28);GPIOE->PUPDR &= (~(0x3 << 28));// MISO    PE13GPIOE->MODER &= (~(0x3 << 26));GPIOE->OSPEEDR &= (~(0x3 << 26));
//  GPIOE->OSPEEDR |= (0x2 << 26);GPIOE->PUPDR &= (~(0x3 << 26));// SCK     PE12    GPIOE->MODER &= (~(0x3 << 24));GPIOE->MODER |= (0x1 << 24);GPIOE->OTYPER &= (~(0x1 << 12));GPIOE->OSPEEDR &= (~(0x3 << 24));
//  GPIOE->OSPEEDR |= (0x2 << 24);GPIOE->PUPDR &= (~(0x3 << 24));// NSS     PE11GPIOE->MODER &= (~(0x3 << 22));GPIOE->MODER |= (0x1 << 22);GPIOE->OTYPER &= (~(0x1 << 11));GPIOE->OSPEEDR &= (~(0x3 << 22));
//  GPIOE->OSPEEDR |= (0x2 << 22);GPIOE->PUPDR &= (~(0x3 << 22));NSS_OUTPUT_L();    // 595芯片的锁存引脚拉低SCK_OUTPUT_L();    // SPI的时钟线拉低
}void SPI_write(unsigned char dat)
{unsigned char i;for(i = 0; i < 8; i++){if(dat & 0x01){MOSI_OUTPUT_H();  // MOSI线写高} else {MOSI_OUTPUT_L();  // MOSI线写低}dat >>= 1;// 时钟线从低电平到高电平的变化时,MOSI数据线上的数据// 被写到595芯片的移位寄存器中SCK_OUTPUT_L();   // SCK拉低delay_us1(10);SCK_OUTPUT_H();   // SCK拉高delay_us1(10);}//NSS_OUTPUT_L();//NSS_OUTPUT_H();}

main.c

#include "gpio.h"
#include "uart4.h"
#include "command.h"
#include "beep.h"
#include "key-TI.h"
#include "si7006.h"
#include "spi.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);
}void led_init(void)
{RCC_MP_AHB4ENSETR |= (0x3 << 4);gpio_init_t gpio_init = {.mode = GPIO_OUTPUT,.type = GPIO_PP,.speed = LOW_SPEED,.pupd = NOPUPD,};hal_gpio_init(GPIOE, &gpio_init, GPIO_PIN_10);hal_gpio_init(GPIOF, &gpio_init, GPIO_PIN_10);hal_gpio_init(GPIOE, &gpio_init, GPIO_PIN_8);
}
void led_flash(void)
{hal_gpio_write(GPIOE, GPIO_PIN_10, GPIO_SET);delay_ms(500);hal_gpio_write(GPIOE, GPIO_PIN_10, GPIO_RESET);delay_ms(500);
}int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
int main(void)
{unsigned char i;SPI_init();while(1){#if 1for(i = 0; i < 10; i++){SPI_write(0xF0);  // 发送数码管的位SPI_write(num[i]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化// 将移位寄存器中的数据锁存到锁存寄存器中delay_ms(1000);}
#else for(i = 0; i < 4; i++){SPI_write(0x80 >> i);SPI_write(num[i+1]);NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();}
#endif}return 0;
}

实验结果

10.6国庆作业(SPI实验)相关推荐

  1. 10.2国庆作业(PWM实验)

    文章目录 作业内容 思路分析 1. 电路分析 2. RCC章节分析 3. GPIO章节分析 4. TIM4章节分析(以蜂鸣器为例) 代码实现 pwm.h pwm.c main.c 作业内容 完成PWM ...

  2. 10.3国庆作业(UART实验)

    文章目录 作业内容 思路分析 1. 电路分析 RCC章节分析 GPIO章节分析 UART章节 代码实现 uart4.h uart4.c main.c 测试结果 作业内容 完成UART实验:实现串口工具 ...

  3. 10.5国庆作业(IIC实验)

    文章目录 作业内容 思路分析 IIC硬件电路图 IIC时序 IIC协议 代码实现 iic.c main.c 测试结果 作业内容 完成IIC实验:实现扩展板上空气温湿度传感器对空气温度与湿度的测量 思路 ...

  4. c语言吴振国课后题答案,Exam10_C作业与实验10期中自测卷参考答案(最新整理)

    <Exam10_C作业与实验10&期中自测卷参考答案(最新整理)>由会员分享,可在线阅读,更多相关<Exam10_C作业与实验10&期中自测卷参考答案(最新整理)(4 ...

  5. 【STM32】SPI 实验代码详解

    友情链接:[小项目关键技术]硬件通信三种方式.串口.IIC.SPI 文章目录 main.c spi.c spi.h SPI 是英语 Serial Peripheral interface 的缩写,顾名 ...

  6. 淮海工学院linux实验报告三,作业三 实验报告

    作业三 实验报告 网络通信 文件传输 实验一 1-1 实验题目 服务器端和客户端各传递1次字符串.考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度.连接时服务器端和客户端数据传 ...

  7. spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(二)

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 文件bsp_spi.c中有两个函数:sp ...

  8. spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(一)

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 第二十七章SPI实验 同I2C一样,SP ...

  9. 数值分析matlab实验报告,数值分析第一次作业matlab实验报告.doc

    数值分析第一次作业matlab实验报告.doc 几种线性方程组迭代算法的MATLAB实现和性能比较用有限差分方法(五点差分格式)求解正方形域上的Poisson方程边值问题用MATLAB语言编写算法程序 ...

最新文章

  1. js控制页面元素的隐藏与显示
  2. poj 1338 优先队列
  3. 加速时光,让你永远70岁的「变老神器」FaceAPP突然爆红,却恐遭美国封杀
  4. 网页背景平铺_在大约十秒钟内为网页创建无缝平铺背景
  5. jQuery Mobile高手必备的十大技巧和代码片段
  6. 码工里开关灯为什么遮罩层在下面_装修公司为什么推荐无主灯设计?
  7. sleek大气后台UI管理系统模板
  8. c++ string截取字符串_String类的常见用法
  9. go使用互斥锁实现协程同步
  10. 你的关注,就是我的动力!(第3次改版中)
  11. UIButton 文字图片排列
  12. 【进阶修炼】——改善C#程序质量(4)
  13. 麟龙指标通达信指标公式源码_麟龙新决策曲线A通达信指标公式源码
  14. 20200909 Vedio Game 游戏平台数据分析
  15. 新媒体运营:23种免费获取流量的运营套路 ,你知道几种? 黎想
  16. ArcGIS图层标注显示(将图层属性名字显示出来)
  17. echarts上加横线标线_Echarts地图添加引导线效果(labelLine)
  18. 银河5 号超级计算机,超级计算器前五名:中国“霸占”第一和第二【图】
  19. v90绝对值编码器回零_由“V90使用绝对值编码器掉电后位置丢失”所想到的
  20. LTR|怎么理解基于机器学习“四大支柱”划分的学习排序方法

热门文章

  1. android kotlin 高阶函数,(三)Kotlin 高阶函数
  2. Gitlab 和项目管理
  3. AcWing——1726.挤奶顺序
  4. 【读书笔记】《游戏改变世界》
  5. HTML/CSS中的空格处理呢
  6. 阿里微博双双IPO 最大受益者是新浪
  7. 嵌入式Linux移植littlevgl7,安富莱V6移植littlevgl的前因后果,附移植好的工程(未优化)...
  8. linux单独用户挂载,Linux与特定用户挂载NFS
  9. 关于2017年软通动力校招的笔试题
  10. 邮箱怎么注册,电子邮件注册用什么邮箱?