oled stm32的spi
其实各种协议是很重要的,这篇文章就当做我对spi协议的一个整理吧。
必要的spi简介:
https://www.cnblogs.com/zengsf/p/7221207.html?utm_source=itdadao&utm_medium=referral

前几天在网上看到一段关于oled的程序
不过那段程序是用的io口模拟spi来控制oled模块的
我在想stm32本身就有spi为何要用io口来模拟spi协议呢
所以就想自己试着写一写。
首先第一部分是关于stm32的spi引脚:
http://www.eeworld.com.cn/mcu/2015/0615/article_20333.html
SPI1->CS ------ PA4
SPI1->MISO ------ PA6
SPI2->CS ------ PB12
SPI2->CLK ------ PB13
SPI2->MISO ------ PB14
SPI2->MOSI ------ PB15
SPI3->CS ------ PA15
SPI3->CLK ------ PB3
SPI3->MISO ------ PB4
SPI3->MOSI ------ PB5
对于SPI ,需要打开相关RCC时钟
主模式下
CLK 配置成复用推挽输出
MOSI 配置成复用推挽输出
MISO 配置成富哦那个或带上拉输入
CS若采用硬件则配置成推挽输出,若采用软件模式,则采用普通IO推挽输出即可。
引脚配置好了,我们下面进行spi模式的配置。下面的图片仅供参考,具体问题还需具体分析。spi的极性和相位为4中,我们还需要根据实际情况去查看。

配置好了之后,我们就开始写应用了,也就是收发函数,收发函数把数据通过配置好的底层发出去。
对于应用函数,我们应该设置好形参,形参主要是用来保存协议来往的数据的。
这个协议的收发函数有两种(因为这个协议是双工的):读写分开的函数,读写一起的。
读写分开的函数:
void SPI_Ecah_Buffer_Send(u8* pBuffer, u16 NumByteToRead) //发送
{
for(int i = 0; i < NumByteToRead; i++)
{
SPI_Conmunication_SendByte(*pBuffer);
pBuffer++;
}
}
void SPI_Buffer_Receive(u8* pBuffer, u16 NumByteToRead) //接收
{
while (NumByteToRead--)
{
*pBuffer = SPI_Conmunication_SendByte (Dummy_Byte);
pBuffer++;
}
}
void SPI_Ecah_Buffer_Send(u8* str , u8* pBuffer, u16 NumByteToRead)
{
for(int i = 0; i < NumByteToRead; i++)
{
*str = SPI_Conmunication_SendByte(*pBuffer);
pBuffer++;
str++;
}
}
OLED引脚介绍: 这个是oled模块上的几个引脚。我们要把它和spi对应起来。
CS:OLED片选信号
RST:OLED复位端口
DC: 命令/数据选择端口(0:读写命令, 1: 读写数据)
SCLK(D0):串口时钟线
SDIN(D1): 串口数据线
CS————GPIOD3; spi的片选
RST————GPIOD4; 复位(spi里没有)
DC—————GPIOD5; 表示写数据还是命令。(spi里没有)
D0——————GPIOD6; spi时钟线
D1——————GPIOD7; spi MOSI,代表oled从这里接收数据,假设单片机是主机,oled屏是从机。
* Mode :O:写命令 1:写数据
* data :数据/命令
*
*/
void SPI_Write(char data, int Mode)
{
int i = 0;
if(Mode) //这个是用来区分命令,还是数据的。
{
OLED_DC(1); //DC引脚输入高,表示写数据
}
else
{
OLED_DC(0); //DC引脚输入低,表示写命令
}
OLED_CS(0); //CS引脚输入低,片选使能 这里符合spi协议,低电平是选中。
for(i = 0; i < 8; i++) //从这句话,我们能判断出,这个spi协议是,8位的, spi分为8帧和16帧
{
OLED_D0(0); //D0引脚输入低
if(data & 0x80) //判断传输的数据最高位为1还是0 从这里判断是先传输高位, spi协议有先传高位或先传低位。
{
OLED_D1(1); //D1引脚输入高
}
else
{
OLED_D1(0); //D1引脚输入低
}
OLED_D0(1); //D1引脚输入高 //先准备好数据,然后在让时钟有一个上升沿,也就是上升沿的时候读取数据。
data <<= 1; //将数据左移一位
}
OLED_DC(0); //DC引脚输入低
OLED_CS(1); //CS引脚输入高,片选失能, //这个可能是为了防止干扰,
}
CS————GPIOD3; spi的片选
RST————GPIOD4; 复位(spi里没有)
DC—————GPIOD5; 表示写数据还是命令。(spi里没有)
D0——————GPIOD6; spi时钟线
D1——————GPIOD7; spi MOSI,代表oled从这里接收数据,假设单片机是主机,oled屏是从机。
SPI1->CS ------ PA4----CS
SPI1->MISO ------ PA6-----D1
SPI1->MOSI ------ PA7
第一个是全双工,其实没有必要,因为oled屏好像不会返回数据给stm32
第二行是从机,我感觉单片机应该还是主机的好
第三个8帧,这个应该不用改
第四个,这个应该也是低电平,空闲时刻D0 ,,,,,,候选项:SPI_CPOL_High(=1)和SPI_CPOL_Low ( =0)
第五个,感觉应该是第一个跳变沿被采集,,,,,,, 候选项:SPI_CPHA_1Edge (=0) 和SPI_CPHA_2Edge(=1)
第六个,cs片选引脚为软件模式
第七个, 这个是波特率,分频为8,可以但是这个时钟默认应该是36M的。
第八个,这个的确是先传高字节
第九个,这个是CRC校验,实际上是这个赋值是7是没有意义的,至于为什么?
https://blog.csdn.net/kobesdu/article/details/50972273
SPI_CRCPolynomial :这是 SPI 的 CRC 校验中的多项式,若我们使用 CRC 校验
时,就使用这个成员的参数(多项式)来计算 CRC 的值。由于本实验的 Flash 不支持 CRC
校验,所以我们向这个结构体成员赋值为7 实际上是没有意义的。
配置完这些结构体成员后,我们要调用SPI_Init() 函数把这些参数写入寄存器中,实现
SPI 的初始化,然后调用
* Mode :O:写命令 1:写数据
* data :数据/命令
*
*/
void SPI_Write(char data, int Mode)
{
int i = 0;
if(Mode) //这个是用来区分命令,还是数据的。
{
OLED_DC(1); //DC引脚输入高,表示写数据
}
else
{
OLED_DC(0); //DC引脚输入低,表示写命令
}
OLED_CS(0); //CS引脚输入低,片选使能 这里符合spi协议,低电平是选中。
OLED_DC(0); //DC引脚输入低
OLED_CS(1); //CS引脚输入高,片选失能, //这个可能是为了防止干扰,
}
oled stm32的spi的更多相关文章
- STM32 F4 SPI Accelerometer
STM32 F4 SPI Accelerometer
- STM32的SPI口的DMA读写[原创www.cnblogs.com/helesheng]
SPI是我最常用的接口之一,连接管脚仅为4根:在常见的芯片间通信方式中,速度远优于UART.I2C等其他接口.STM32的SPI口的同步时钟最快可到PCLK的二分之一,单个字节或字的通信时间都在us以 ...
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]
一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...
- STM32的SPI问题。
问题描述: 之前一直使用的单片机是LPC2109,对其SPI很熟悉.基本就是原本拿来稍作修改就用.由于某种原因需要使用STM32,然后设备的驱动是之前写好的,只修改了一些硬件控制端口,由于硬件驱动使用 ...
- stm32之SPI通信协议
SPI (Serial Peripheral interface),顾名思义就是串行外围设备接口.SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为P ...
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现
一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...
- STM32之spi管理模式
1)sip管理模式分为:硬件管理和软件管理:主要由NSS .SSI.SSM决定: NSS是芯片上一个实实在在的引脚,SSI和SSM是SPI_CR1控制器里的的位. 值得注意的是:NSS分外部引脚和内部 ...
- STM32 HAL SPI读取MPU6500的设备ID异常
1.问题背景 近前,使用STM32F4 HAL库的SPI读取MPU6500出现异常. 现象:读取ID失败,返回0,以为硬件焊接问题,各种排查,最后为了示波器测试方便,把读取ID的函数放到While(1 ...
- STM32之SPI时钟相位选择
SPI的时钟模式分为四种,由SPI_CR1寄存器的两位CPOL,CPHA组合选择. CPOL 如果为1,则时钟的空闲电平为高电平:CPOL 如果为0,则时钟的空闲电平为低电平.空闲电平影响不大. CP ...
随机推荐
- iOS基本UI控件总结
包括以下几类: //继承自NSObject:(暂列为控件) UIColor *_color; //颜色 UIImage *_image; //图像 //继承自UIView:只能相应手势UI ...
- PIM-DM协议内核触发机制及协议执行机制记录
PIM-DM和PIM-SM是组播路由ASM(随意信源组播)中的两种不同模式.相对PIM-SM的组播注冊机制.PIM-DM的扩散机制显得更加粗犷. 一.PIM-DM无需向内核注冊pimreg虚接口. 可 ...
- Rails + rabl
当我们使用rails generate scaffold的方式生成MVC的时候,rails会自己主动给我们生成一系列的文件,包含了怎样用json显示model的view.这样事实上默认了你的系统是一个 ...
- dig---域名查询
dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. QUESTION SECTION 这部分是提问,显示你要查询的域名 ANSWER SECTION 即答案,显示查询到的域名对应的IP ...
- 用node.js从零开始去写一个简单的爬虫
如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...
- 【Codeforces Round #456 (Div. 2) A】Tricky Alchemy
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 统计需要的个数. 不够了,就买. [代码] #include <bits/stdc++.h> #define ll lo ...
- [置顶]
Docker学习总结(3)——Docker实战之入门以及Dockerfile(三)
应用镜像 csphere/wordpress:4.2 # cd docker-training/wordpress/ # ls -a . license.txt wp-config-sample.ph ...
- 使用Ant 和 Maven打包发布命令行程序(转载)
From:https://www.linux178.com/Java/maven-release.html 用Java写了一个命令行的小程序,使用的Intellij IDE是IDEA13原来一直使用A ...
- webclient类学习
(HttpWebRequest模拟请求登录):当一些硬件设备接口 或需要调用其他地方的接口时,模拟请求登录获取接口的数据就很有必要. webclient类:只想从特定的URI请求文件,则使用WebCl ...
- 微软推送Win10致全球网络负担增大,中国网友表示毫无压力
7月29日晚间,微软的Windows10操作系统正式上市发行.微软将面向全球190个国家地区进行windows10的免费升级推送. 眼下, Windows 10 正以疯狂的速度登陆全球各类设备 ...