2482|7

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[N32L43X评测] 3.硬件I2C驱动OLED [复制链接]

 

上篇[N32L43X评测] 2.模拟I2C驱动OLED介绍了使用GPIO模拟I2C来驱动OLED显示屏,

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

硬件连接

GND  ——  GND

VCC  ——  3.3V

SCL  ——  PB8

SDA  ——  PB9

软件代码

I2C1配置参考官方例程:

/**
 * [url=home.php?mod=space&uid=159083]@brief[/url] i2c master init
 *
 *
 */
void i2c_master_init(void)
{
    I2C_InitType i2c1_master;
    GPIO_InitType i2c1_gpio;
    RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_I2C1, ENABLE);
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);

    /*PB8 -- SCL; PB9 -- SDA*/
    GPIO_InitStruct(&i2c1_gpio);
    i2c1_gpio.Pin               = GPIO_PIN_8 | GPIO_PIN_9;
    i2c1_gpio.GPIO_Slew_Rate    = GPIO_Slew_Rate_High;
    i2c1_gpio.GPIO_Mode         = GPIO_Mode_AF_OD;
    i2c1_gpio.GPIO_Alternate    = GPIO_AF4_I2C1;
    i2c1_gpio.GPIO_Pull         = GPIO_Pull_Up;
    GPIO_InitPeripheral(GPIOB, &i2c1_gpio);

    I2C_DeInit(I2C1);
    i2c1_master.BusMode     = I2C_BUSMODE_I2C;
    i2c1_master.FmDutyCycle = I2C_FMDUTYCYCLE_2;
    i2c1_master.OwnAddr1    = I2C_MASTER_ADDR;
    i2c1_master.AckEnable   = I2C_ACKEN;
    i2c1_master.AddrMode    = I2C_ADDR_MODE_7BIT;
    i2c1_master.ClkSpeed    = 400000; //400K 100000 100K

    I2C_Init(I2C1, &i2c1_master);
    I2C_Enable(I2C1, ENABLE);
}


void i2c_master_send(unsigned char* data, int len)
{
    unsigned char* sendBufferPtr = data;

    while (I2C_GetFlag(I2C1, I2C_FLAG_BUSY));

    I2C_GenerateStart(I2C1, ENABLE);

    while (!I2C_CheckEvent(I2C1, I2C_EVT_MASTER_MODE_FLAG)); // EV5

    I2C_SendAddr7bit(I2C1, I2C_SLAVE_ADDR, I2C_DIRECTION_SEND);

    while (!I2C_CheckEvent(I2C1, I2C_EVT_MASTER_TXMODE_FLAG)); // EV6

    // send data
    while (len-- > 0)
    {
        I2C_SendData(I2C1, *sendBufferPtr++);

        while (!I2C_CheckEvent(I2C1, I2C_EVT_MASTER_DATA_SENDING)); // EV8
    }

    while (!I2C_CheckEvent(I2C1, I2C_EVT_MASTER_DATA_SENDED)); // EV8-2

    I2C_GenerateStop(I2C1, ENABLE);

}

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
}

//向设备写数据
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
}

运行测试

100Kbps模式

HW_I2C_OLED_100k

400Kbps模式

HW_I2C_OLED_400k

测试代码

N32L43x_HW_I2C_OLED.zip (517.66 KB, 下载次数: 12)

 

最新回复

有没有试过1M模式?  详情 回复 发表于 2022-8-15 07:13
点赞 关注
 
 

回复
举报

7504

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

谢谢分享,期待后续。

个人签名

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

 
 
 

回复

9726

帖子

24

TA的资源

版主

板凳
 

这个灌篮的“视频”占多大空间?

点评

占了29KB大小  详情 回复 发表于 2022-8-12 19:46
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

4
 
littleshrimp 发表于 2022-8-12 09:06 这个灌篮的“视频”占多大空间?

占了29KB大小

点评

还挺小的,这东西是怎么做出来的?  详情 回复 发表于 2022-8-12 22:58
 
 
 

回复

9726

帖子

24

TA的资源

版主

5
 
805721366 发表于 2022-8-12 19:46 占了29KB大小

还挺小的,这东西是怎么做出来的?

点评

可以用GIF Movie Gear、ZHS9、Img2Lcd这3个软件制作,GIF Movie Gear 可以调整GIF图片的大小和帧数,ZHS9 将GIF图片转换成一帧一帧的bmp格式图片,Img2Lcd用来图片取模转换成数组  详情 回复 发表于 2022-8-13 23:27
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

6
 
littleshrimp 发表于 2022-8-12 22:58 还挺小的,这东西是怎么做出来的?

可以用GIF Movie Gear、ZHS9、Img2Lcd这3个软件制作,GIF Movie Gear 可以调整GIF图片的大小和帧数,ZHS9 将GIF图片转换成一帧一帧的bmp格式图片,Img2Lcd用来图片取模转换成数组

 
 
 

回复

6842

帖子

11

TA的资源

版主

7
 
有没有试过1M模式?

点评

后面测试下  详情 回复 发表于 2022-8-15 19:53
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

8
 
lugl4313820 发表于 2022-8-15 07:13 有没有试过1M模式?

后面测试下

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 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
快速回复 返回顶部 返回列表