SPI协议梳理附SSD1306OLED屏幕驱动

文章列表

嵌入式各协议标准按照OSI模型的思路进行逐个梳理,文章列表如下:

  1. 串行通信&UART协议梳理附STM32平台采用DMA以UART方式收发不定长信息
  2. I²C总线协议梳理附STM32平台I2C总线SSD1306OLED屏幕软件模拟方式驱动
  3. SDIO协议梳理附SD卡读写以及FATFS移植实例
  4. SPI协议梳理附SSD1306OLED屏幕驱动

SPI(Serial Peripheral Interface)也采用串行通信的思想;是一种简单的双向四线制的全双工总线协议,SPI协议标准涉及OSI模型的物理层,数据链路层。

物理层

协议项协议内容
通信模式全双工
连接线电气特性四根线:MOSI(主发从收线),MISO(主收从发线),SCLK(时钟线),CS(片选线,如果单设备可以不使用,即三线制)
电平值8v,5v,3.3v
速度不规定最大速率,取决于主机与设备的SPI接口速度
主从模式一主一从(三线制),一主多从(四线制)

一个主设备可以通过提供时钟信号和片选控制多个从设备,SPI规定从设备的时钟由主设备提供,没有时钟信号从设备不能正常工作。

  • 独立从机型SPI(典型连线方式):

在这里插入图片描述

  • 菊花链型SPI连线方式:

在这里插入图片描述

数据链路层

SPI协议需要片选线选择需要通信的从机,然而原始的SPI协议因为没有信号应答机制(如I²C应答位),所以SPI主机实际并不知道从机是否正确收到信息,甚至不知道从机是否真的存在。

极性和相位

极性

无数据传输的空闲状态时,SCLK为低电平,即CPOL=0:

在这里插入图片描述

无数据传输的空闲状态时,SCLK为高电平,即CPOL=1:

在这里插入图片描述

相位

所谓采样,也就是SDA进行下一步的输出电平信号的转换时间。

CPHA=0:SCLK第一个跳变沿开始采样:

在这里插入图片描述

CPHA=1:SCLK第二个跳变沿开始采样:

在这里插入图片描述

传输模式
模式极性相位
模式1低电平空闲,高电平传输前沿采样,后沿输出
模式2低电平空闲,高电平传输后沿采样,前沿输出
模式3高电平空闲,低电平传输前沿采样,后沿输出
模式4高电平空闲,低电平传输后沿采样,前沿输出

模式1,CP0,CH0:

在这里插入图片描述

模式2,CP0,CH1:

在这里插入图片描述

模式3,CP1,CH0:

在这里插入图片描述

模式4,CP1,CH1:

在这里插入图片描述

SSD1306的SPI通信实例

SSD1306链接有七根线,除了VCC和VSS外有:SCLK(时钟),SDA(MOSI,主出从入),CS(片选),D/C(数据/命令),RES(复位)

接下来引述手册说明:

端口使用方式
CSThis pin is the chip select input. (active LOW).
D/CThis is Data/Command control pin. When it is pulled HIGH (i.e. connect to VDD), the data at D[7:0] is treated as data. When it is pulled LOW, the data at D[7:0] will be transferred to the command register.
RESThis pin is reset signal input. When the pin is pulled LOW, initialization of the chip is executed. Keep this pin HIGH (i.e. connect to VDD) during normal operation.

在这里插入图片描述

如上表上图所示:

  • CS传输时需要置于低电平
  • DC端口选择传输的时命令字符还是数据字符,高电平传输数据,低电平传输命令
  • SCLK上升沿输出数据,下降沿采样。
functionRDR/WCSDCD0
write commandtie lowtie lowlowlow
write datatie lowtie lowlowhigh

SDIN is shifted into an 8-bit shift register on every rising edge of SCLK in the order of D7, D6, … D0. D/C# is sampled on every eighth clock and the data byte in the shift register is written to the Graphic Display Data RAM (GDDRAM) or command register in the same clock.

核心代码

uint8_t OLED_InitCmd[26]={
    0xAE,0x20,0x10,0xB0,0xC8,0x40,                              
    0x81,0x7F,0xA1,0xA6,0xA8,0x3F,
    0xA4,0xD3,0x00,0xD5,0xF0,0xD9,
    0x22,0xDA,0x12,0xDB,0x20,0x8D,
    0x14,0xAF,
};

void ssd1306_spi_init(void){
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);
    uint8_t count_send;
    for(count_send=0;count_send<26;count_send++){
        HAL_SPI_Transmit(&hspi1,&OLED_InitCmd[count_send],1,HAL_MAX_DELAY);
    }
}

void ssd1306_spi_send_data_arr(uint32_t data_num){
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
    uint32_t count_send;
    uint8_t data=0xFF;
    for(count_send=0;count_send<data_num;count_send++){
        HAL_SPI_Transmit(&hspi1,&data,1,HAL_MAX_DELAY);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSD1306是一种常见的OLED屏幕驱动芯片,可以通过SPI通信进行控制。下面是使用spidev驱动在Linux用户空间中实现SSD1306 SPI驱动的示例代码: ```python import spidev # 初始化SPI设备 spi = spidev.SpiDev() spi.open(0, 0) # 指定SPI总线和设备号 # 设置SPI参数 spi.max_speed_hz = 1000000 # 设置SPI时钟频率 spi.mode = 0b00 # 设置SPI模式,这里使用模式0 # SSD1306初始化命令 init_cmds = [ 0xAE, # 关闭显示 0xD5, 0x80, # 设置时钟分频因子,震荡频率 0xA8, 0x3F, # 设置驱动路数 0xD3, 0x00, # 设置显示偏移 0x40, # 设置显示开始行 0x8D, 0x14, # 设置充电泵电压 0x20, 0x00, # 设置内存地址模式 0xA1, # 设置段重定向 0xC8, # 设置COM扫描方向 0xDA, 0x12, # 设置COM引脚硬件配置 0x81, 0xCF, # 设置对比度 0xD9, 0xF1, # 设置预充电周期 0xDB, 0x40, # 设置VCOMH电压倍率 0xA4, # 全局显示开启 0xA6, # 设置显示方式,正常显示 0xAF # 打开显示 ] # 发送初始化命令 for cmd in init_cmds: spi.xfer([cmd]) # 显示测试 data = [0xFF] * 128 # 生成测试数据,全亮 spi.xfer2(data) # 发送数据 # 关闭SPI设备 spi.close() ``` 这段代码使用了spidev库来进行SPI通信。首先,我们初始化了SPI设备,并设置了SPI的时钟频率和模式。然后,根据SSD1306的初始化命令序列,依次发送命令给SSD1306芯片,完成初始化。最后,我们生成了一个全亮的测试数据,并通过SPI发送给SSD1306芯片,实现显示测试。最后,关闭SPI设备。 需要注意的是,这段代码是在Linux用户空间中运行的,使用了spidev驱动。如果需要使用中断和DMA传输等高级功能,可能需要编写自定义的SPI驱动程序,或者使用其他支持这些功能的SPI驱动

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值