5597|6

441

帖子

3

TA的资源

纯净的硅(高级)

楼主
 

【MSPM0L1306 LaunchPad】i2c驱动OLED显示 [复制链接]

 

这篇来学习下使用MSPM0L1306开发板驱动OLED显示。

 

一、硬件部分

 

1.1、芯片内部框图

 

L1306芯片内部有两路I2C接口

1.2、引脚配置

测试使用I2C0端口,使用的引脚是PA1和PA10

 

 

二、程序

 

2.1、i2c.c

#include "ti_msp_dl_config.h"
#include "i2c/i2c.h"
static const DL_I2C_ClockConfig gI2C_0ClockConfig = 
{
    .clockSel = DL_I2C_CLOCK_BUSCLK,
    .divideRatio = DL_I2C_CLOCK_DIVIDE_1,
};

SYSCONFIG_WEAK void SYSCFG_DL_I2C_0_init(void) 
{
	DL_I2C_setClockConfig(I2C_0_INST,(DL_I2C_ClockConfig *) &gI2C_0ClockConfig);
	DL_I2C_setAnalogGlitchFilterPulseWidth(I2C_0_INST, DL_I2C_ANALOG_GLITCH_FILTER_WIDTH_50NS);
	DL_I2C_enableAnalogGlitchFilter(I2C_0_INST);

	/* Configure Controller Mode */
	DL_I2C_resetControllerTransfer(I2C_0_INST);
	/* Set frequency to 400000 Hz*/
	DL_I2C_setTimerPeriod(I2C_0_INST, 7);
	DL_I2C_setControllerTXFIFOThreshold(I2C_0_INST, DL_I2C_TX_FIFO_LEVEL_EMPTY);
	DL_I2C_setControllerRXFIFOThreshold(I2C_0_INST, DL_I2C_RX_FIFO_LEVEL_BYTES_1);
	DL_I2C_enableControllerClockStretching(I2C_0_INST);

	/* Enable module */
	DL_I2C_enableController(I2C_0_INST);
}

void init_i2c(void)
{
	DL_I2C_reset(I2C_0_INST);
	DL_I2C_enablePower(I2C_0_INST);
	
	DL_GPIO_initPeripheralInputFunctionFeatures(GPIO_I2C_0_IOMUX_SDA,
			GPIO_I2C_0_IOMUX_SDA_FUNC, DL_GPIO_INVERSION_DISABLE,
			DL_GPIO_RESISTOR_NONE, DL_GPIO_HYSTERESIS_DISABLE,
			DL_GPIO_WAKEUP_DISABLE);
	DL_GPIO_initPeripheralInputFunctionFeatures(GPIO_I2C_0_IOMUX_SCL,
			GPIO_I2C_0_IOMUX_SCL_FUNC, DL_GPIO_INVERSION_DISABLE,
			DL_GPIO_RESISTOR_NONE, DL_GPIO_HYSTERESIS_DISABLE,
			DL_GPIO_WAKEUP_DISABLE);
	DL_GPIO_enableHiZ(GPIO_I2C_0_IOMUX_SDA);
	DL_GPIO_enableHiZ(GPIO_I2C_0_IOMUX_SCL);
	
	SYSCFG_DL_I2C_0_init();
}

 

2.2、i2c.h

#ifndef _I2C_H
#define _I2C_H

#include <ti/driverlib/driverlib.h>

/* Defines for I2C_0 */
#define I2C_0_INST                                                          I2C0
#define I2C_0_INST_IRQHandler                                    I2C0_IRQHandler
#define I2C_0_INST_INT_IRQN                                        I2C0_INT_IRQn
#define I2C_0_BUS_SPEED_HZ                                                400000
#define GPIO_I2C_0_SDA_PORT                                                GPIOA
#define GPIO_I2C_0_SDA_PIN                                        DL_GPIO_PIN_10
#define GPIO_I2C_0_IOMUX_SDA                                     (IOMUX_PINCM11)
#define GPIO_I2C_0_IOMUX_SDA_FUNC                      IOMUX_PINCM11_PF_I2C0_SDA
#define GPIO_I2C_0_SCL_PORT                                                GPIOA
#define GPIO_I2C_0_SCL_PIN                                         DL_GPIO_PIN_1
#define GPIO_I2C_0_IOMUX_SCL                                      (IOMUX_PINCM2)
#define GPIO_I2C_0_IOMUX_SCL_FUNC                       IOMUX_PINCM2_PF_I2C0_SCL

void init_i2c(void);

#endif

 

2.3、oled.c

#include "ti_msp_dl_config.h"
#include "i2c/i2c.h"
#include "oled/oled.h"
#include "oled/codetab.h"
#include <stdio.h>
#include "systick/systick.h"

void I2C_WriteByte(uint8_t addr, uint8_t dat)
{
  uint8_t temp[2];
  temp[0] = addr;
  temp[1] = dat;
	
  DL_I2C_fillControllerTXFIFO(I2C_0_INST, temp, 2);
  while (!(DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));

	DL_I2C_startControllerTransfer(I2C_0_INST, OLED_ADDRESS, DL_I2C_CONTROLLER_DIRECTION_TX, 2);
	while (DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
	while (!(DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));
	DL_I2C_flushControllerTXFIFO(I2C_0_INST);
}


void WriteCmd(unsigned char I2C_Command)
{
    I2C_WriteByte(0x00, I2C_Command);
}

void WriteDat(unsigned char I2C_Data) 
{
    I2C_WriteByte(0x40, I2C_Data);
}

void OLED_WrCmd(unsigned char IIC_Command)
{
	WriteCmd(IIC_Command);
}

void OLED_Init(void)
{
	SysTick_Delay_ms(100);
	WriteCmd(0xAE); //display off
	WriteCmd(0x20);	//Set Memory Addressing Mode	
	WriteCmd(0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	WriteCmd(0xb0);	//Set Page Start Address for Page Addressing Mode,0-7
	WriteCmd(0xc8);	//Set COM Output Scan Direction
	WriteCmd(0x00); //---set low column address
	WriteCmd(0x10); //---set high column address
	WriteCmd(0x40); //--set start line address
	WriteCmd(0x81); //--set contrast control register
	WriteCmd(0xff); //ÁÁ¶Èµ÷½Ú 0x00~0xff
	WriteCmd(0xa1); //--set segment re-map 0 to 127
	WriteCmd(0xa6); //--set normal display
	WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
	WriteCmd(0x3F); //
	WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	WriteCmd(0xd3); //-set display offset
	WriteCmd(0x00); //-not offset
	WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
	WriteCmd(0xf0); //--set divide ratio
	WriteCmd(0xd9); //--set pre-charge period
	WriteCmd(0x22); //
	WriteCmd(0xda); //--set com pins hardware configuration
	WriteCmd(0x12);
	WriteCmd(0xdb); //--set vcomh
	WriteCmd(0x40); //0x20,0.77xVcc
	WriteCmd(0x8d); //--set DC-DC enable
	WriteCmd(0x14); //
	WriteCmd(0xaf); //--turn on oled panel
}

void OLED_SetPos(unsigned char x, unsigned char y) 
{ 
	WriteCmd(0xb0+y);
	WriteCmd(((x&0xf0)>>4)|0x10);
	WriteCmd((x&0x0f)|0x01);
}

void OLED_Fill(unsigned char fill_Data)//È«ÆÁÌî³ä
{
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
		WriteCmd(0xb0+m);		//page0-page1
		WriteCmd(0x00);		//low column start address
		WriteCmd(0x10);		//high column start address
		for(n=0;n<128;n++)
			{
				WriteDat(fill_Data);
			}
	}
}

void OLED_CLS(void)//ÇåÆÁ
{
	OLED_Fill(0xff);
}

void OLED_ON(void)
{
	WriteCmd(0X8D);  //ÉèÖõçºÉ±Ã
	WriteCmd(0X14);  //¿ªÆôµçºÉ±Ã
	WriteCmd(0XAF);  //OLED»½ÐÑ
}

void OLED_OFF(void)
{
	WriteCmd(0X8D);  //ÉèÖõçºÉ±Ã
	WriteCmd(0X10);  //¹Ø±ÕµçºÉ±Ã
	WriteCmd(0XAE);  //OLEDÐÝÃß
}

void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
	unsigned char c = 0,i = 0,j = 0;
	switch(TextSize)
	{
		case 1:
		{
			while(ch[j] != '\0')
			{
				c = ch[j] - 32;
				if(x > 126)
				{
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<6;i++)
					WriteDat(F6x8[c][i]);
				x += 6;
				j++;
			}
		}break;
		case 2:
		{
			while(ch[j] != '\0')
			{
				c = ch[j] - 32;
				if(x > 120)
				{
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<8;i++)
					WriteDat(F8X16[c*16+i]);
				OLED_SetPos(x,y+1);
				for(i=0;i<8;i++)
					WriteDat(F8X16[c*16+i+8]);
				x += 8;
				j++;
			}
		}break;
	}
}

void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
	unsigned char wm=0;
	unsigned int  adder=32*N;
	OLED_SetPos(x , y);
	for(wm = 0;wm < 16;wm++)
	{
		WriteDat(F16x16[adder]);
		adder += 1;
	}
	OLED_SetPos(x,y + 1);
	for(wm = 0;wm < 16;wm++)
	{
		WriteDat(F16x16[adder]);
		adder += 1;
	}
}

void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
	unsigned int j=0;
	unsigned char x,y;

  if(y1%8==0)
		y = y1/8;
  else
		y = y1/8 + 1;
	for(y=y0;y<y1;y++)
	{
		OLED_SetPos(x0,y);
    for(x=x0;x<x1;x++)
		{
			WriteDat(BMP[j++]);
		}
	}
}

 

2.4、oled.h

#ifndef __OLED_I2C_H
#define	__OLED_I2C_H

#define OLED_ADDRESS	0x3c //ͨ¹ýµ÷Õû0Rµç×è,ÆÁ¿ÉÒÔ0x78ºÍ0x7AÁ½¸öµØÖ· -- ĬÈÏ0x78

void OLED_Init(void);
void OLED_SetPos(unsigned char x, unsigned char y);
void OLED_Fill(unsigned char fill_Data);
void OLED_CLS(void);
void OLED_ON(void);
void OLED_OFF(void);
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize);
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N);
void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);

#endif

 

2.5、main.c

#include "ti_msp_dl_config.h"
#include "led/led.h"
#include "systick/systick.h"
#include "uart/uart.h"
#include "key/key.h"
#include "i2c/i2c.h"
#include "i2c/I2C_communication.h"
#include "oled/oled.h"

int main(void)
{
	uint8_t dd=0;
	uint8_t tx_buf[8];
	SYSCFG_DL_init();
	init_systick();
	init_led();
	init_uart(115200);
	init_i2c();
	key_init();
	
	DL_SYSCTL_disableSleepOnExit();
	printf("mspm0l1306 board test! \r\n");
	
	OLED_Init();
	OLED_Fill(0x00);
	OLED_ShowStr(0,0,"MSPM0L1306",2);
	OLED_ShowStr(0,2,"I2C OLED",2);	
	
	while (1) 
	{
		//key_test();
		led2_g_tog();
		SysTick_Delay_ms(20);
	}
}

 

三、运行结果

 

 

 

此帖出自MSPM0 MCU论坛

最新回复

分辨率小点可以,我用SPI驱动屏,240*240分辨率,16M 得速度也不是很快   详情 回复 发表于 2023-11-6 16:50
点赞 关注
 
 

回复
举报

6995

帖子

11

TA的资源

版主

沙发
 
6666,i2c的硬件驱动的精华就在于这几个I2C_WriteByte之间,其的者是相同的。
此帖出自MSPM0 MCU论坛

点评

这个板卡的i2c调试用了不少时间,库函数开始不熟悉。  详情 回复 发表于 2023-11-2 22:31
 
 
 

回复

441

帖子

3

TA的资源

纯净的硅(高级)

板凳
 
lugl4313820 发表于 2023-11-2 21:38 6666,i2c的硬件驱动的精华就在于这几个I2C_WriteByte之间,其的者是相同的。

这个板卡的i2c调试用了不少时间,库函数开始不熟悉。

此帖出自MSPM0 MCU论坛

点评

辛苦辛苦呀,大佬的文章写得非常不错,花费不少心思吧。  详情 回复 发表于 2023-11-3 08:02
 
 
 

回复

6995

帖子

11

TA的资源

版主

4
 
TL-LED 发表于 2023-11-2 22:31 这个板卡的i2c调试用了不少时间,库函数开始不熟悉。

辛苦辛苦呀,大佬的文章写得非常不错,花费不少心思吧。

此帖出自MSPM0 MCU论坛
 
 
 

回复

6498

帖子

10

TA的资源

版主

5
 

主要是IIC的速度达到不了要求,对于屏幕控制有点慢 

此帖出自MSPM0 MCU论坛

点评

400K的速率,屏幕小的话还可以吧  详情 回复 发表于 2023-11-6 15:35
个人签名

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

 
 
 

回复

441

帖子

3

TA的资源

纯净的硅(高级)

6
 
秦天qintian0303 发表于 2023-11-6 11:03 主要是IIC的速度达到不了要求,对于屏幕控制有点慢 

400K的速率,屏幕小的话还可以吧

此帖出自MSPM0 MCU论坛

点评

分辨率小点可以,我用SPI驱动屏,240*240分辨率,16M 得速度也不是很快  详情 回复 发表于 2023-11-6 16:50
 
 
 

回复

6498

帖子

10

TA的资源

版主

7
 
TL-LED 发表于 2023-11-6 15:35 400K的速率,屏幕小的话还可以吧

分辨率小点可以,我用SPI驱动屏,240*240分辨率,16M 得速度也不是很快

此帖出自MSPM0 MCU论坛
个人签名

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

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
FPGA——人工智能的未来

FPGA——人工智能的未来 基于大规模数字逻辑的人工智能实现的可行性分析 注:本文为一年前写成,具有一定的科普性,其中有一些 ...

1602的学习总结(菜鸟入门级)

先来叙述一些概念。 LCM和LCD的区别 LCM【Liquid Crystal Module】液晶显示模块,通常包括显示驱动电路,接口电路等等。往 ...

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

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

有奖直播:nanoPower技术:延长电池寿命,提升传感器性能 直播资料合集

直播资料合集 nanoPower技术:延长电池寿命,提升传感器性能 直播回放: >>点击观看 直播文档: > ...

【小熊派BearPi-HM Micro】三:烧录编译的固件程序

本帖最后由 数码小叶 于 2022-4-5 13:15 编辑 上一篇已经成功编译了源码,接下来就是把编译的源码结果烧录到小熊派BearPi-HM ...

DC-DC升压到5V异常

我的升压电路图如下图: 608263 我的BAT输入是三节7号干电池,用的DC-DC升压芯片是PT1311,下图是PT1311部分介绍: 608 ...

【花雕动手做】有趣好玩的音乐可视化系列小项目(19)--通体光纤灯

偶然心血来潮,想要做一个音乐可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不 ...

请问你们平常芯片或者元件都是去哪买的?

请问你们平常芯片或者元件都是去哪买的?我发现某宝现在太病态了,价格乱七八糟,每一个标实价的,只要你拍了,基本都不发货,要 ...

System Identification Methods for (Operational) Modal Analysis Review and Com...

本帖最后由 lihuanyang 于 2022-12-19 09:49 编辑 基于模型分析预览对照的系统辨识方法;全英文原版

【大学生电子竞赛题目分析】——2023年全国赛B题《同轴电缆长度与终端负载检测装置》

没有在论坛内看到这次竞赛B题的讨论,只看到一个问的,还没人回答 其实,今年的竞赛题中,B题是工作量最小的一个。问题是必须 ...

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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