MSP432P401R TI Drivers 库函数学习笔记(七)I2C驱动OLED屏幕

发布者:pingbashou最新更新时间:2022-07-13 来源: csdn关键字:MSP432P401R  TI  Drivers  库函数  I2C驱动  OLED 手机看文章 扫描二维码
随时随地手机看文章

平台:Code Composer Studio 10.4.0

MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件

(MSP-EXP432P401R)


API (机翻)

I2C API官方手册


void I2C_cancel (I2C_Handle handle)

取消所有I2C传输。

 

void I2C_close (I2C_Handle handle)

关闭I2C驱动程序实例

 

int_fast16_t I2C_control (I2C_Handle handle, uint_fast16_t cmd, void *controlArg)

在驱动程序实例上执行特定的实现特性

 

void I2C_init (void)

用于初始化I2C驱动程序

 

I2C_Handle I2C_open (uint_least8_t index, I2C_Params *params)

打开I2C驱动程序实例

 

void I2C_Params_init (I2C_Params *params)

将I2C_Params结构初始化为其默认值

 

bool I2C_transfer (I2C_Handle handle, I2C_Transaction *transaction)

对一个从机进行I2C传输

 

int_fast16_t I2C_transferTimeout (I2C_Handle handle, I2C_Transaction *transaction, uint32_t timeout)

对一个从机进行I2C传输(带超时)


上机实战

引脚配置

I2C引脚配置

在这里插入图片描述

工作指示灯LED1引脚配置

在这里插入图片描述

文件结构

在这里插入图片描述

I2C 初始化、读写函数

myI2C.c

/*

 * myI2C.c

 *

 *  Created on: 2021年8月4日

 *      Author: Royic

 */



#include "./inc/myI2C.h"


#define NULL 0


I2C_Handle hi2c1;


void My_I2C_Init(I2C_Handle *hi2cHandle, uint_least8_t index)

{

// One-time init of I2C driver

I2C_init();

// initialize optional I2C bus parameters

I2C_Params params;

I2C_Params_init(¶ms);

params.bitRate = I2C_400kHz;

// Open I2C bus for usage

*hi2cHandle = I2C_open(index, ¶ms);

}


bool My_I2C_Read(I2C_Handle *hi2cHandle, uint_least8_t slaveAddress, uint8_t *readBuf, size_t readCount)

{

I2C_Transaction transaction = {0};

transaction.slaveAddress = slaveAddress;

transaction.writeBuf = NULL;

transaction.writeCount = 0;

// Read from I2C slave device

transaction.readBuf = readBuf;

transaction.readCount = readCount;

return I2C_transfer(*hi2cHandle, &transaction);

}


bool My_I2C_Write(I2C_Handle *hi2cHandle, uint_least8_t slaveAddress, uint8_t *writeBuf, size_t writeCount)

{

I2C_Transaction transaction = {0};

transaction.slaveAddress = slaveAddress;

transaction.readBuf = NULL;

transaction.readCount = 0;

// Write to I2C slave device

transaction.writeBuf = writeBuf;

transaction.writeCount = writeCount;

return I2C_transfer(*hi2cHandle, &transaction);

}


myI2C.h

/*

 * myI2C.h

 *

 *  Created on: 2021年8月4日

 *      Author: Royic

 */


#ifndef INC_MYI2C_H_

#define INC_MYI2C_H_


#include "./inc/main.h"


// Import I2C Driver definitions

#include


void My_I2C_Init(I2C_Handle *hi2cHandle, uint_least8_t index);

bool My_I2C_Write(I2C_Handle *hi2cHandle, uint_least8_t slaveAddress, uint8_t *writeBuf, size_t writeCount);

bool My_I2C_Read(I2C_Handle *hi2cHandle, uint_least8_t slaveAddress, uint8_t *readBuf, size_t readCount);


extern I2C_Handle hi2c1;


#endif /* INC_MYI2C_H_ */


OLED初始化和测试代码

main.c

/*

 *  ======== main_tirtos.c ========

 */


#include "./inc/main.h"


/* POSIX Header files */

#include


/* RTOS header files */

#include BIOS.h>


/* Driver configuration */

#include

#include


#include "./inc/myTask.h"

#include "./inc/myI2C.h"


#include "./OLED/OLED.h"


/*

 *  ======== main ========

 */

int main(void)

{

    /* Call driver init functions */

    Board_init();

    GPIO_init();


    My_Task_Init(mainThread, 1, 1024);


    BIOS_start();


    return (0);

}


/*

 *  ======== mainThread ========

 */

void *mainThread(void *arg0)

{

My_Task_Init(LED_Task, 1, 1024);

My_I2C_Init(&hi2c1, I2C1);


OLED_Init();

OLED_Clear();

OLED_Display_On();

OLED_ShowString(0, 0, "MSP432P401R OLED", 1);

OLED_ShowString(0, 2, "   2021-08-04", 1);

    while(1)

    {

    usleep(1000);

    }

}


main.h

/*

 * main.h

 *

 *  Created on: 2021年8月2日

 *      Author: Royic

 */


#ifndef INC_MAIN_H_

#define INC_MAIN_H_


/* For usleep() */

#include

#include

#include


/* Driver configuration */

#include "ti_drivers_config.h"


#endif /* INC_MAIN_H_ */


OLED 驱动程序

OLED.c

/*

 * OLED.c

 *

 *  Created on: Jan 17, 2021

 *      Author: Royic

 */



#include "OLED.h"

#include

#include "OLED_Font.h"


//OLED的显存

//存放格式如下.

//[0]0 1 2 3 ... 127

//[1]0 1 2 3 ... 127

//[2]0 1 2 3 ... 127

//[3]0 1 2 3 ... 127

//[4]0 1 2 3 ... 127

//[5]0 1 2 3 ... 127

//[6]0 1 2 3 ... 127

//[7]0 1 2 3 ... 127


void Write_IIC_Command(unsigned char I2C_Command)//写命令

{

    uint8_t Datas[2] = {0};

    Datas[0] = OLED_WriteCom_Addr;

    Datas[1] = I2C_Command;

    My_I2C_Write(&Scr12864_HI2C, OLED_ADDRESS>>1, Datas, 2);

}


/*

 * 第1个参数为I2C操作句柄

   第2个参数为从机设备地址

   第3个参数为从机寄存器地址

   第4个参数为从机寄存器地址长度

   第5个参数为发送的数据

   第6个参数为传输数据的大小

   第7个参数为操作超时时间   */



void Write_IIC_Data(unsigned char IIC_Data)//写数据

{

    uint8_t Datas[2] = {0};

    Datas[0] = OLED_WriteData_Addr;

    Datas[1] = IIC_Data;

    My_I2C_Write(&Scr12864_HI2C, OLED_ADDRESS>>1, Datas, 2);

}



void OLED_WR_Byte(unsigned dat,unsigned cmd)

{

if(cmd)

{

Write_IIC_Data(dat);

}

else

{

Write_IIC_Command(dat);

}

}



/********************************************

// fill_Picture

********************************************/

void fill_picture(unsigned char fill_Data)

{

unsigned char m,n;

for(m=0;m<8;m++)

{

OLED_WR_Byte(0xb0+m,0); //page0-page1

OLED_WR_Byte(0x00,0); //low column start address

OLED_WR_Byte(0x10,0); //high column start address

for(n=0;n<128;n++)

{

OLED_WR_Byte(fill_Data,1);

}

}

}



//坐标设置


void OLED_Set_Pos(unsigned char x, unsigned char y)

{

OLED_WR_Byte(0xb0+y,OLED_CMD);

OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);

OLED_WR_Byte((x&0x0f),OLED_CMD);

}


//开启OLED显示

void OLED_Display_On(void)

{

OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON

OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON

}


//关闭OLED显示

void OLED_Display_Off(void)

{

OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF

OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF

}


//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!

void OLED_Clear(void)

{

uint8_t i,n;

for(i=0;i<8;i++)

{

OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)

OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址

OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址

for(n=0;n<128;n++)

OLED_WR_Byte(0,OLED_DATA);

} //更新显示

}


void OLED_On(void)

{

uint8_t i,n;

for(i=0;i<8;i++)

{

OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)

OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址

OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址

for(n=0;n<128;n++)

OLED_WR_Byte(1,OLED_DATA);

} //更新显示

}


//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示

//size:选择字体 1——8*16 0——6*8

void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)

{

unsigned char c=0,i=0;

c=chr-' ';//得到偏移后的值

if(x>Max_Column-1)

{x=0;y=y+2;}

if(Char_Size)

{

OLED_Set_Pos(x,y);

for(i=0;i<8;i++)

OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);

OLED_Set_Pos(x,y+1);

for(i=0;i<8;i++)

OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);

}

else

{

OLED_Set_Pos(x,y);

for(i=0;i<6;i++)

OLED_WR_Byte(F6x8[c][i],OLED_DATA);

}

}


//m^n函数

uint32_t oled_pow(uint8_t m,uint8_t n)

{

uint32_t result=1;

while(n--)

result*=m;

return result;

}


//显示2个数字

//x,y :起点坐标

//len :数字的位数

//size:字体大小

//mode:模式 0,填充模式;1,叠加模式

//num:数值(0~4294967295);

void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)

{

uint8_t t,temp;

uint8_t enshow=0;

for(t=0;t {

temp=(num/oled_pow(10,len-t-1))%10;

if(enshow==0&&t<(len-1))

{

if(temp==0)

{

OLED_ShowChar(x+(size2/2)*t,y,' ',size2);

continue;

}

else

enshow=1;

}

OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);

}

}


//显示一个字符号串

void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)

{

unsigned char j=0;

while (chr[j]!='')

{

OLED_ShowChar(x,y,chr[j],Char_Size);

x+=8;

if(x>120)

{x=0;y+=2;}

j++;

}

}


//显示汉字

void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)

{

uint8_t t,adder=0;

OLED_Set_Pos(x,y);

    for(t=0;t<16;t++)

{

    OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);

    adder+=1;

}

OLED_Set_Pos(x,y+1);

for(t=0;t<16;t++)

{

OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);

adder+=1;

}

}


/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/

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 {

OLED_Set_Pos(x0,y);

for(x=x0;x {

OLED_WR_Byte(BMP[j++],OLED_DATA);

}

}

}


//初始化SSD1306

void OLED_Init(void)

{


OLED_WR_Byte(0xAE,OLED_CMD);//--display off

OLED_WR_Byte(0x00,OLED_CMD);//---set low column address

OLED_WR_Byte(0x10,OLED_CMD);//---set high column address

OLED_WR_Byte(0x40,OLED_CMD);//--set start line address

OLED_WR_Byte(0xB0,OLED_CMD);//--set page address

OLED_WR_Byte(0x81,OLED_CMD); // contract control

OLED_WR_Byte(0xFF,OLED_CMD);//--128

OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap

OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse

OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)

OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty

OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction

OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset

OLED_WR_Byte(0x00,OLED_CMD);//


OLED_WR_Byte(0xD5,OLED_CMD);//set osc division

OLED_WR_Byte(0x80,OLED_CMD);//


OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off

OLED_WR_Byte(0x05,OLED_CMD);//


OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period

OLED_WR_Byte(0xF1,OLED_CMD);//


OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion

OLED_WR_Byte(0x12,OLED_CMD);//


OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh

OLED_WR_Byte(0x30,OLED_CMD);//


OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable

OLED_WR_Byte(0x14,OLED_CMD);//


OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel

}


OLED.h

/*

 * OLED.h

[1] [2] [3] [4]
关键字:MSP432P401R  TI  Drivers  库函数  I2C驱动  OLED 引用地址:MSP432P401R TI Drivers 库函数学习笔记(七)I2C驱动OLED屏幕

上一篇:MSP432P401R TI Drivers 库函数学习笔记(八)ADC
下一篇:MSP432 库函数实现 PID 电机调角度、调速

推荐阅读最新更新时间:2024-11-14 21:29

MSP432库函数输出多路任意占空比PWM波
本文适用于msp432库函数开发使用者,且已具备msp432环境(我使用的是keil),已下载SDK包,并有simeplink例程。若需要这些资源的,可以在评论区回复,我看见了会及时发送的! 今天要分享的是使用msp432库函数输出多路pwm,用以控制基础的电机转动。 1)所用到的引脚 P7.4~P7.7 、P2.4~P2.7共八路提供选择 2)查看数据手册 由手册可以知道,定时器TA0,寄存器CCR0~CCR4对应P2.4 - P2.7 定时器TA1,寄存器CCR0~CCR4对应P7.4 - P7.7 3)输出PWM初始化 /* Timer_A Compare Configuration Parameter
[单片机]
MSP432<font color='red'>库函数</font>输出多路任意占空比PWM波
德州仪器推出低功耗双通道按钮复位控制器
  2013 年 6 月 20 日,北京讯 日前,德州仪器 (TI) 宣布面向计步器、健身腕表 (fitness bands)、手机以及平板电脑等空间有限的低功耗应用推出两款微型按钮复位控制器。该双通道 TPS3420 与 TPS3421 功耗低,提供可选复位时间延迟,可增强系统稳定性。 支持嵌入式电池的便携式电子产品需要按钮复位控制器。在实践中,用户持续按住一个或两个外部按键一定时间,就可关闭便携式设备或产生复位。TPS3420 与 TPS3421 使用长时间输入延迟,不但可提供所需的系统复位,而且还可避免短时间按钮或按键按下产生复位。这种复位配置可在软件中断和硬系统复位之间实现差异化。这些定时器是 TI 最新按钮控制器系列
[电源管理]
<font color='red'>德州仪器</font>推出低功耗双通道按钮复位控制器
MSP430F5529硬件IIC驱动IIC接口的OLED
//****************************************************************************** // MSP430F552x Demo - USCI_B0, I2C Master multiple byte TX/RX // // Description: I2C master communicates to I2C slave sending and receiving // 3 different messages of different length. I2C master will enter LPM0 mode // while waiting
[单片机]
柔性OLED屏幕短缺还将维持多年
腾讯科技讯 据外媒报道,当iPhone 8要改用柔性OLED面板的消息曝光后,各种面板短缺的消息便开始集中爆发,许多业内人士称OLED面板供应短缺会造成iPhone 8延期上市。虽然现在我们还不知道苹果能否度过这一难关,但由于大量厂商一拥而上,OLED面板的供应肯定会成个大问题。群智咨询(Sigmaintell)的研究报告显示,OLED面板短缺的问题可能还会持续多年。 从产量来看,三星依然是世界上最大的塑性OLED面板生产商。不过,苹果为了保证未来不被三星卡脖子,也开始入股LG打造OLED面板,而许多中国制造商也准备投入300亿美元,明年开始挑战三星的王位。 不过,研究人员认为这些新上马的生产线产能五年才能逐步稳定下来,而在此期间
[手机便携]
总投50亿元,东旭光电G6-OLED 载板玻璃项目签约甘肃天水
近日,东旭光电发布公告称,公司于9 月 29 日与天水市人民政府(以下简称“天水市政府”)在甘肃省天水市签署了《项目投资协议书》,双方就共同在天水市投资建设“G6-OLED 载板玻璃项目”、“中性硼硅药用玻璃管及制瓶项目” 事宜达成合作意向,项目总投资规模为70亿元。 公告显示,G6-OLED 载板玻璃项目、中性硼硅药用玻璃管及制瓶项目投资规模分别为 50 亿元和 20 亿元。其中,天水市政府自行或协调金融机构,分别为“G6-OLED 载板玻璃项目”、 “中性硼硅药用玻璃管及制瓶项目”提供 20 亿元和 10 亿元融资。 据悉,项目建设内容包括:4 条 G6-OLED 载板生产线,达产后年产 432 万片;5 窑 10 线药用
[手机便携]
总投50亿元,东旭光电G6-<font color='red'>OLED</font> 载板玻璃项目签约甘肃天水
驱动德州仪器助机器人“行稳致远”
由中国高科技门户OFweek维科网主办,OFweek维科网· 机器人 承办的“OFweek 2024(第十三届)中国机器人产业大会”于4月18日—19日在深圳成功举办。在首日举办的“技术前沿趋势”专场上, 德州仪器工业系统部门电机驱动及机器人总经理赵向源发表《半导体技术助力打造更智能、更安全、更经济的机器人》 主题演讲。 随着新一轮科技革命和产业变革加速演进新一代信息技术、生物技术、新材料等与机器人技术深度融合,机器人产业迈入跨越式发展黄金期,也成为推动新质生产力的重要驱动力。其中,半导体在机器人的开发和功能中扮演着至关重要的角色。 作为全球领先的半导体设计与制造企业,德州仪器致力于通过模拟以及嵌入式处理技术和产品,助力打造更智
[机器人]
三星Galaxy A73手机将采用中国厂商的OLED面板
Galaxy A 系列是三星的中端智能手机系列,在全球的销量一直不错,三星也在每年更新该系列机型。   据 SamMobile 报道,三星正在考虑在 Galaxy A73 上使用中国厂商的 OLED 面板,而非此前一直使用的三星显示 OLED 面板。   为了以更低的价格获得 OLED 面板,三星电子预计将从中国的京东方和华星光电进行采购,消息称这两家公司已经在为 Galaxy A73 开发显示面板。   SamMobile 表示,中国厂商正逐渐在三星的供应链中扮演更重要的角色。他们已经在电池方面占据了一席之地,华星光电也在为三星低端的 Galaxy M 系列手机提供 OLED 面板。   IT之家了解到,三星 Gala
[手机便携]
德州仪器 (TI) 全新可编程逻辑产品系列助力工程师在数分钟内完成从概念到原型设计的整个
全新可编程逻辑器件和无代码设计工具可降低工程设计复杂性和成本、减少布板空间并缩短时间。 德州仪器全新可编程逻辑产品系列允许工程师在单个芯片上集成多达 40 个逻辑及模拟功能,与分立式实施方案相比,大幅减小了电路板尺寸。 中国上海(2024 年 10 月 22 日)– 德州仪器 (TI)(纳斯达克股票代码:TXN)近日推出了可编程逻辑器件 (PLD) 系列。此产品系列以德州仪器出色的逻辑产品系列为基础,旨在帮助工程师简化任何应用的逻辑设计。德州仪器的全新 PLD 产品系列能够在单个器件中集成多达 40 个组合和顺序逻辑及模拟功能,与分立式逻辑实施方案相比,可帮助将电路板尺寸缩小高达 94%,并降低系统成本。此外,与市场
[工业控制]
<font color='red'>德州仪器</font> (<font color='red'>TI</font>) 全新可编程逻辑产品系列助力工程师在数分钟内完成从概念到原型设计的整个
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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