2283|6

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[N32L43X评测] 5.硬件SPI驱动OLED [复制链接]

 

前面[N32L43X评测] 2.模拟I2C驱动OLED  [N32L43X评测] 3.硬件I2C驱动OLED [N32L43X评测] 4.模拟SPI驱动OLED介绍了模拟I2C、硬件I2C、模拟SPI来驱动OLED显示屏,

此篇介绍使用N32L43x硬件SPI2轮询模式来实现驱动OLED显示屏。

硬件连接

GND ——  GND

VCC ——  3.3V

DO  ——  PB13
DI  ——  PB15
RES ——  PC7
DC  ——  PC6
CS  ——  PB12

软件代码

SPI2配置参考官方例程:

配置时需注意驱动OLED,SPI模式需配置为模式3,

即空闲时SCK时钟高电平 SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;

采样时刻为偶数边沿采样 SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;

数据传输设置为MSB最高有效位先行 SPI_InitStructure.FirstBit = SPI_FB_MSB;

如果SPI SCK时钟频率过高或过低,可设置时钟频率 SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256;(如果时钟频率仍过高,可设置APB2总线频率RCC_ConfigPclk2(RCC_HCLK_DIV4);)

#ifdef HW_SPI
//SPI初始化
void SPI_Initial(void)
{
    SPI_InitType SPI_InitStructure;
    GPIO_InitType GPIO_InitStructure;

    /* PCLK2 = HCLK/2 */
    RCC_ConfigPclk2(RCC_HCLK_DIV4);
    /* Enable GPIO clock for SPI_MASTER */
    RCC_EnableAPB2PeriphClk(SPI_MASTER_GPIO_CLK | RCC_APB2_PERIPH_AFIO | RCC_SPI_CS, ENABLE);
    /* Enable SPI_MASTER Periph clock */
    RCC_EnableAPB2PeriphClk(SPI_MASTER_CLK, ENABLE);

    GPIO_InitStruct(&GPIO_InitStructure);
    //GPIO_CS初始化设置
    GPIO_InitStruct(&GPIO_InitStructure);
    GPIO_InitStructure.Pin = PIN_SPI_CS;
    GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
    GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
    GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitPeripheral(PORT_SPI_CS, &GPIO_InitStructure);
    SPI_CS_DISABLE;
    /* Configure SPI_MASTER pins: SCK and MOSI ---------------------------------*/
    /* Configure SCK and MOSI pins as Alternate Function Push Pull */
    GPIO_InitStructure.Pin        = SPI_MASTER_PIN_SCK | SPI_MASTER_PIN_MOSI;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_SPI2;
    GPIO_InitPeripheral(SPI_MASTER_GPIO, &GPIO_InitStructure);
    /* Configure MISO pin as Input Floating  */
    GPIO_InitStructure.Pin = SPI_MASTER_PIN_MISO;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
    GPIO_InitPeripheral(SPI_MASTER_GPIO, &GPIO_InitStructure);

    /* SPI_MASTER configuration ------------------------------------------------*/
    SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
    SPI_InitStructure.SpiMode       = SPI_MODE_MASTER;
    SPI_InitStructure.DataLen       = SPI_DATA_SIZE_8BITS;
    SPI_InitStructure.CLKPOL        = SPI_CLKPOL_HIGH;
    SPI_InitStructure.CLKPHA        = SPI_CLKPHA_SECOND_EDGE;
    SPI_InitStructure.NSS           = SPI_NSS_SOFT;
    SPI_InitStructure.BaudRatePres  = SPI_BR_PRESCALER_256;
    SPI_InitStructure.FirstBit      = SPI_FB_MSB;
    SPI_InitStructure.CRCPoly       = 7;
    SPI_Init(SPI_MASTER, &SPI_InitStructure);

    /* Enable SPI_MASTER */
    SPI_Enable(SPI_MASTER, ENABLE);

}
#endif

OLED代码变更部分:

//向设备写控制命令
static void OLED_Write_CMD(unsigned char cmd)
{
    #ifdef SW_I2C
    I2C_Start();
    I2C_Send_Byte(0x78);
    I2C_Wait_Ack();
    I2C_Send_Byte(0x00);
    I2C_Wait_Ack();
    I2C_Send_Byte(cmd);
    I2C_Wait_Ack();
    I2C_Stop();
    #endif
    #ifdef HW_I2C
    unsigned char tx_buf[BUF_SIZE] = {0x00, cmd};
    i2c_master_send(tx_buf, BUF_SIZE);
    #endif
    #ifdef SW_SPI
    OLED_CS_LOW;
    OLED_DC_LOW;
    SPI_WriteByte(cmd);
    OLED_CS_HIGH;
    #endif
    #ifdef HW_SPI
    OLED_CS_LOW;
    OLED_DC_LOW;
    while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_TE_FLAG) == RESET);
    SPI_I2S_TransmitData(SPI_MASTER, cmd);
    while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_RNE_FLAG) == RESET);
    SPI_I2S_ReceiveData(SPI_MASTER);
    OLED_CS_HIGH;
    #endif
}

//向设备写数据
static void OLED_Write_Date(unsigned char date)
{
    #ifdef SW_I2C
    I2C_Start();
    I2C_Send_Byte(0x78);
    I2C_Wait_Ack();
    I2C_Send_Byte(0x40);
    I2C_Wait_Ack();
    I2C_Send_Byte(date);
    I2C_Wait_Ack();
    I2C_Stop();
    #endif
    #ifdef HW_I2C
    unsigned char tx_buf[BUF_SIZE] = {0x40, date};
    i2c_master_send(tx_buf, BUF_SIZE);
    #endif
    #ifdef SW_SPI
    OLED_CS_LOW;
    OLED_DC_HIGH;
    SPI_WriteByte(date);
    OLED_CS_HIGH;
    #endif
    #ifdef HW_SPI
    OLED_CS_LOW;
    OLED_DC_HIGH;
    while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_TE_FLAG) == RESET);
    SPI_I2S_TransmitData(SPI_MASTER, date);
    while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_RNE_FLAG) == RESET);
    SPI_I2S_ReceiveData(SPI_MASTER);
    OLED_CS_HIGH;
    #endif
}

运行测试

HW_SPI_OLED

测试代码

N32L43x_HW_SPI_OLED.zip (520.48 KB, 下载次数: 10)

 

最新回复

请问,那个OS_SYSTEM.c,是自己写的任务调度吗   详情 回复 发表于 2023-10-10 15:44
点赞 关注
 
 

回复
举报

7452

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

谢谢分享,期待后续。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

6841

帖子

11

TA的资源

版主

板凳
 
看来刷新率还是挺好的。
 
 
 

回复

6060

帖子

6

TA的资源

版主

4
 

N32L43X的主频是多少?我和国民科技无缘,总是擦肩而过

点评

最高工作主频可达108MHz,很奶思的一款芯片  详情 回复 发表于 2022-7-30 22:35
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 
秦天qintian0303 发表于 2022-7-30 20:12 N32L43X的主频是多少?我和国民科技无缘,总是擦肩而过

最高工作主频可达108MHz,很奶思的一款芯片

点评

还是很不错的,不过有USB的话基本上用96M比较方便  详情 回复 发表于 2022-7-30 23:39
 
 
 

回复

6060

帖子

6

TA的资源

版主

6
 
805721366 发表于 2022-7-30 22:35 最高工作主频可达108MHz,很奶思的一款芯片

还是很不错的,不过有USB的话基本上用96M比较方便

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 

请问,那个OS_SYSTEM.c,是自己写的任务调度吗

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
【EEWORLD模块整理】+tlc2543(A/D)

今年我用的模块资料 已经证实好用

FPGA DCM时钟管理单元的理解

看Xilinx的Datasheet会注意到Xilinx的FPGA没有PLL,其实DCM就是时间管理单元。 --------------------------------------------- ...

电烙铁的使用小技巧

本人原创——乃自己当时查阅的资料和自己的一点点经验而写成,如有错误请多指教! 首先要说明的是,使用电烙 ...

ubuntu下修改内核发生“ncurses libraries“错误(解决方法)

BSEC@bsec-server:~/kernel/Kernel$ make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC script ...

在屏幕上显示大写字母DMH的VGA控制器

本帖最后由 PuesueDream 于 2015-7-22 17:18 编辑 基于ise14.7平台,用Nexys3开发板弄了一个显示程序。程序包含六部分 首 ...

msp430f149波特率设置

本帖最后由 灞波儿奔 于 2020-1-10 23:14 编辑 TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的 ...

为什么给一个变量赋值0时,直接写=0,而给它赋值0xffffffff时要写成=0xffffffffu

为什么给一个变量赋值0时,直接写*ram=0即可,而给它赋值0xffffffff时要写成*ram=0xffffffffu, 以下是具体的代码 /****** ...

报名提醒:最后几小时,100套价值390元平头哥RISC-V生态开发板免费送~

最后几小时啦,想要的网友速速来~100套价值390元平头哥RISC-V生态开发板——RVB2601来袭,现在提交创意,即有机会免费 ...

在现代计算机上运行虚拟Mac Quadra 900

682909 macintosh.js 是一个模拟 1991 年 Macintosh Quadra 900 和摩托罗拉 CPU 的虚拟机,它完全用 JavaScript 编写(因此请 ...

反激电源辅助供电绕组串联电阻

看到很多反激电源辅助绕组串联电阻的,如下图电阻Rvcc,想问一下这个电阻的作用是什么?

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表