110SPI通讯及其OLED

SPI:全双工,高位先发,同步通讯总线(当两个数据线都存在时能同步发送和接受)
SCLK(sck):时钟线
MOSI:数据线(主机输出,从机输入)(可以只有一根,只进行主机输出从机读取)
MISO:数据线 (主机输入,从机输出)(可以只有一根,只进行主机读取从机输出)
片选线(ss(cs)):数量不定( 可以为零, 只存在一个的情况下让从机接地就可以)

硬件支持SPI从模式的情况下,可以让CPU为从机
SPI可以软件设置主从模式,通过寄存器

通过片选线来选择通讯对象(通常低电平使能,高电平失能,只是通常)




与I2C相比:IO口,线的资源占用多,但通讯数据相对高了,因为不用每8位数据应答一次


spi的四种模式
根据时钟空闲时的高低状态(时钟极性),和时钟的前跳变和 后跳变沿有效 (时钟相位) (根据时钟空闲状态不同前后跳变沿上升下降 不固定,空高则前下后上,空低则前上后下 ,一共有四种
CPOL决定是时钟空间的状态 (时钟极性)
CPHA决定锁存的有效沿 (时钟相位)
          时钟相位决定前后沿分别是做数据采样还是数据输出,(前采后输或前输后采,采的是接受线,输的是输出线)

SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性(CPOL)和相位(CPHA)可以进行配置。
(1)时钟极性(CPOL):
-----<1>CPOL=0,串行同步时钟的空闲状态为低电平;
-----<2>CPOL=1,串行同步时钟的空闲状态为高电平
(2)时钟相位(CPHA):
-----<1>CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样; 
-----<2>CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
(3)SPI通信根据时钟相位和时钟极性的不同组合,可以分为4种模式。在嵌入式设备开发的过程中。
第一件事就是确定其设备支持哪一种SPI通信模式。常用的模式为:CPOL=1,CPHA=0 和 CPOL=1,CPHA=1

且数据线的数据变化由时钟线控制,只有时钟线变化了,数据线才会根据设定变化


思路:
0.初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
1.初始化IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);  
2.初始化和使能SPI(使用库函数API,不使用的话自己模拟时序,不用在这里初始化)
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; 
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
3.操作SPI
3.1 库函数API
void SPI_WriterByte(u8 dat)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

// ͨ¹ý SPI2·¢ËÍÒ»×Ö½ÚÊý¾Ý 
SPI_I2S_SendData(SPI1, dat);
}
3.2 模拟时序
void SPI_WriterByte(u8 dat)
{
u8 i;   

for(i=0;i<8;i++)
{   
OLED_SCLK_Clr();
if(dat&0x80)
{
OLED_SDIN_Set();
}
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
//
// if(miso)
// {
// byte |= 1;
// }
//
// byte <<= 1;
dat<<=1;   
}
// return byte
}



************************************************************

OLED
spi线:SPI相关的通讯线
RESET:复位线(大多设备是低电平复位,平常不用时为高电平)
数据/命令线(DC线):决定是写命令还是写数据的线,很多器件也有寄存器,给予其命令让其执行相应的功能,且有些是命令和数据相结合,先给命令再给该命令所需的数据

很多器件都需要初始化,且厂商会给初始化函数,直接使用就可以了,当然也可以自己研究,只是比较麻烦

思路:
用厂商提供的函数去使用便可,但要理解,有时候厂商的函数会有些问题,甚至一些功能欠缺,需要自己修改或者是参看已有的去写一个需要的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值