SPI协议和OLED

一个芯片下面可以接很多个SPI设备,比如说SPI FLASH,SPI OLED,它们直接通过三条先来传输数据。第一条线是时钟线,然后是DO线,就是date output就是芯片给外设发数据

然后读数据的话就是DI, 芯片上有很多个SPI设备,但是我们怎么区分要访问哪一个设备呢,所以就会有一个CS0,片选引脚。在硬件上,都是通过SCK,DI,DO来传输数据,都是通过CS来片选。那数据是怎么传的呢,我们可以看看数据格式,

看这里,在第一个时钟周期里面传输一位,在第二个时钟中期里面传输第二位,先传输最高位,bit0是最后传输的。读的时候也是一样的,每发一个时钟读一位。

先讲一个简单的例子,我想把0x56发出去,怎么发呢,56的二进制是0b01010110,我想把这8位数据发送出去,我先发送给SPI flash,首先让片选引脚变成有效,CS0编程低电平,在整个传输过程中要保持低电平,然后我们SPICLK就发出一个脉冲,在这个脉冲期间,我先传输最高位,所以在MOSI的第一个脉冲就要保持低电平,然后SPI FLASH会在时钟的上升沿会把这个MOSI上的引脚读进去,以此类推。

在我们210上给出了4种SPI的图形,这四种图形的差别在哪里呢,我们先来看看前面两种


第一种是Format A,第二种是Format B,他们的差别在于MISO这条线上数据格式有点不一样,当我这个SPI设备提供完8位数据给我们的芯片的时候,在下一个时钟周期没到来之前,这SPI设备是把什么数据放到这个线上,FORMAT A放的是上一次接收的这一字节里面的最高位。FROMAT B是放得下一个字节的最低位。

  \

然后在看看这个,CPOL是极性的意思,CPHA是相位的意思。极性就是在没有开始传输数据之前,你这个SPICLK是什么电平,如上图,有的是高,有的是低。

但是你这里要注意看是上升沿还是下降沿获取数据。上图就是CPOL CPHA就是下降沿获取数据。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用stm32来控制spi接口的oledoled为6pin接口 #define __OLED_SPI_H #include "stm32f10x.h" #define OLED_SPI_GPIO GPIOF #define OLED_SPI_RCCEN RCC_APB2Periph_GPIOF #define OLED_SPI_SCL GPIO_Pin_14 //D0 #define OLED_SPI_SDA GPIO_Pin_13 //D1 #define OLED_SPI_RST GPIO_Pin_11 //RST #define OLED_SPI_DC GPIO_Pin_12 //DC #define OLED_CMD 0 //??? #define OLED_DATA 1 //??? #define OLED_SPI_D0_OL GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_SCL) //D0 IO?????? #define OLED_SPI_D0_OH GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_SCL) //D0 IO?????? #define OLED_SPI_D1_OL GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_SDA) //D1 IO?????? #define OLED_SPI_D1_OH GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_SDA) //D1 IO?????? #define OLED_SPI_RST_OL GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_RST) //RST IO?????? #define OLED_SPI_RST_OH GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_RST) //RST IO?????? #define OLED_SPI_DC_OL GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_DC) //DC IO?????? #define OLED_SPI_DC_OH GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_DC) //DC IO?????? #define OLED_SPI_RST_Clr() GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_RST) //RST IO?????? #define OLED_SPI_RST_Set() GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_RST) //RST IO?????? #define OLED_SPI_RS_Clr() GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_DC) //DC IO?????? #define OLED_SPI_RS_Set() GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_DC) //DC IO?????? #define OLED_SPI_SCLK_Clr() GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_SCL) //D0 IO?????? #define OLED_SPI_SCLK_Set() GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_SCL) //D0 IO?????? #define OLED_SPI_SDIN_Clr() GPIO_ResetBits(OLED_SPI_GPIO, OLED_SPI_SDA) //D1 IO?????? #define OLED_SPI_SDIN_Set() GPIO_SetBits(OLED_SPI_GPIO, OLED_SPI_SDA) //D1 IO?????? void OLED_SPI_WR_Byte(uint8_t dat,uint8_t cmd); void OLED_SPI_Init(void); void OLED_SPI_WrDat(unsigned char data); void OLED_SPI_WrCmd(unsigned char cmd); void OLED_SPI_Set_Pos(unsigned char x, unsigned char y); void OLED_SPI_Fill(unsigned char bmp_data); void OLED_SPI_CLS(void); void OLED2_P6x8Str(u8 x,u8 y,u8 ch[]);//小字符串; void OLED2_P16x32Str(u8 x,u8 y,unsigned char ch[]); void sssb1(void); void sssb2(void); void sspb1(void); void ssxl(void); void hallokitty_bmp(void); void sjb_bmp(u8 rock); void LCD_PutPixel(u8 x,u8 y); void LCD_Put_Column(u8 x,u8 y,u8 data); void OLED_write_2_num(unsigned char X,unsigned char Y,signed int s); void OLED_write_char(unsigned char c); #endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值