10.6国庆作业(SPI实验)
文章目录
- 作业内容
- 思路分析
- 电路图分析
- 通信协议
- RCC章节分析
- GPIO章节分析
- 代码实现
- spi.h
- spi.c
- main.c
- 实验结果
作业内容
完成SPI实验:实现数码晶体管显示相应数字
思路分析
电路图分析
通信协议
- 起始信号:NSS信号线由高变低,是SPI通讯的起始信号
- 结束信号:NSS信号线由低变高,是SPI通讯的停止信号
- 数据传输:SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。
RCC章节分析
设置GPIOE清除寄存器使能:RCC_MP_AHB4ENCLRR[4] = 1
GPIO章节分析
- 设置PE11、PE12、PE14引脚为输出模式,PE13引脚为输入模式
- 设置PE11、PE12、PE14引脚为推挽输出
- 设置输出速度为超高速
- 设置禁止上下拉
代码实现
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实验)相关推荐
- 10.2国庆作业(PWM实验)
文章目录 作业内容 思路分析 1. 电路分析 2. RCC章节分析 3. GPIO章节分析 4. TIM4章节分析(以蜂鸣器为例) 代码实现 pwm.h pwm.c main.c 作业内容 完成PWM ...
- 10.3国庆作业(UART实验)
文章目录 作业内容 思路分析 1. 电路分析 RCC章节分析 GPIO章节分析 UART章节 代码实现 uart4.h uart4.c main.c 测试结果 作业内容 完成UART实验:实现串口工具 ...
- 10.5国庆作业(IIC实验)
文章目录 作业内容 思路分析 IIC硬件电路图 IIC时序 IIC协议 代码实现 iic.c main.c 测试结果 作业内容 完成IIC实验:实现扩展板上空气温湿度传感器对空气温度与湿度的测量 思路 ...
- c语言吴振国课后题答案,Exam10_C作业与实验10期中自测卷参考答案(最新整理)
<Exam10_C作业与实验10&期中自测卷参考答案(最新整理)>由会员分享,可在线阅读,更多相关<Exam10_C作业与实验10&期中自测卷参考答案(最新整理)(4 ...
- 【STM32】SPI 实验代码详解
友情链接:[小项目关键技术]硬件通信三种方式.串口.IIC.SPI 文章目录 main.c spi.c spi.h SPI 是英语 Serial Peripheral interface 的缩写,顾名 ...
- 淮海工学院linux实验报告三,作业三 实验报告
作业三 实验报告 网络通信 文件传输 实验一 1-1 实验题目 服务器端和客户端各传递1次字符串.考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度.连接时服务器端和客户端数据传 ...
- spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(二)
1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 文件bsp_spi.c中有两个函数:sp ...
- spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(一)
1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 第二十七章SPI实验 同I2C一样,SP ...
- 数值分析matlab实验报告,数值分析第一次作业matlab实验报告.doc
数值分析第一次作业matlab实验报告.doc 几种线性方程组迭代算法的MATLAB实现和性能比较用有限差分方法(五点差分格式)求解正方形域上的Poisson方程边值问题用MATLAB语言编写算法程序 ...
最新文章
- js控制页面元素的隐藏与显示
- poj 1338 优先队列
- 加速时光,让你永远70岁的「变老神器」FaceAPP突然爆红,却恐遭美国封杀
- 网页背景平铺_在大约十秒钟内为网页创建无缝平铺背景
- jQuery Mobile高手必备的十大技巧和代码片段
- 码工里开关灯为什么遮罩层在下面_装修公司为什么推荐无主灯设计?
- sleek大气后台UI管理系统模板
- c++ string截取字符串_String类的常见用法
- go使用互斥锁实现协程同步
- 你的关注,就是我的动力!(第3次改版中)
- UIButton 文字图片排列
- 【进阶修炼】——改善C#程序质量(4)
- 麟龙指标通达信指标公式源码_麟龙新决策曲线A通达信指标公式源码
- 20200909 Vedio Game 游戏平台数据分析
- 新媒体运营:23种免费获取流量的运营套路 ,你知道几种? 黎想
- ArcGIS图层标注显示(将图层属性名字显示出来)
- echarts上加横线标线_Echarts地图添加引导线效果(labelLine)
- 银河5 号超级计算机,超级计算器前五名:中国“霸占”第一和第二【图】
- v90绝对值编码器回零_由“V90使用绝对值编码器掉电后位置丢失”所想到的
- LTR|怎么理解基于机器学习“四大支柱”划分的学习排序方法