MSP430F5529 DriverLib 库函数I2C驱动OLED屏幕

发布者:DataExplorer最新更新时间:2022-07-14 来源: csdn关键字:MSP430F5529  库函数  I2C驱动  OLED屏幕 手机看文章 扫描二维码
随时随地手机看文章

平台:Code Composer Studio 10.4.0

MSP430F5529 LaunchPad™ Development Kit

(MSP‑EXP430F5529LP)


I2C驱动代码

P3.0为SDA,P3.1为SCL


MSP430F5529_I2C.c

#include "driverlib.h"


#define I2C_USCI_BASE USCI_B0_BASE

#define I2C_USCI_VECTOR USCI_B0_VECTOR

#define I2C_USCI_IV UCB0IV


#define I2C_BUF_LENGTH 32

static char i2c_buf[I2C_BUF_LENGTH];

static uint8_t i2c_buf_len = 0;

static uint8_t i2c_buf_cur = 0;


static uint8_t *i2c_rx_buf = 0;

static uint8_t i2c_rx_buf_len = 0;


void Init_I2C_GPIO(void)

{

    /* Select I2C function for I2C_SDA & I2C_SCL */

    GPIO_setAsPeripheralModuleFunctionOutputPin(

            GPIO_PORT_P3,

            GPIO_PIN0 | GPIO_PIN1);

}



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

 * @brief  Configures I2C

 * @param  none

 * @return none

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


void I2C_init(uint8_t slaveAddress)

{

  /* I2C Master Configuration Parameter */

  USCI_B_I2C_initMasterParam i2cConfig =

  {

    USCI_B_I2C_CLOCKSOURCE_SMCLK,

    UCS_getSMCLK(),

    USCI_B_I2C_SET_DATA_RATE_400KBPS

  };

  /* Initialize USCI_B0 and I2C Master to communicate with slave devices*/

  USCI_B_I2C_initMaster(I2C_USCI_BASE, &i2cConfig);


  /* Enable I2C Module to start operations */

  USCI_B_I2C_enable(I2C_USCI_BASE);


  // Specify slave address

  USCI_B_I2C_setSlaveAddress(I2C_USCI_BASE, slaveAddress);

  USCI_B_I2C_clearInterrupt(I2C_USCI_BASE, USCI_B_I2C_RECEIVE_INTERRUPT);

  USCI_B_I2C_enableInterrupt(I2C_USCI_BASE, USCI_B_I2C_RECEIVE_INTERRUPT);

  USCI_B_I2C_clearInterrupt(I2C_USCI_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);

  USCI_B_I2C_enableInterrupt(I2C_USCI_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);


    return;

}



/* write a byte to specific register, cannot called in interrupt context */

void writeByte(uint8_t byte)

{

    while (USCI_B_I2C_isBusBusy(I2C_USCI_BASE));


    USCI_B_I2C_setMode(I2C_USCI_BASE, USCI_B_I2C_TRANSMIT_MODE);


    // Initiate start and send first character

    i2c_buf[0] = byte;

    i2c_buf_cur = 1;

    i2c_buf_len = 1;

    USCI_B_I2C_masterSendMultiByteStart(I2C_USCI_BASE, i2c_buf[0]);


    // wait for end

    __bis_SR_register(GIE + LPM0_bits);

    __no_operation();

}


/* write a word to specific register, cannot called in interrupt context */

void writeWord(uint16_t word)

{

    while (USCI_B_I2C_isBusBusy(I2C_USCI_BASE));


    USCI_B_I2C_setMode(I2C_USCI_BASE, USCI_B_I2C_TRANSMIT_MODE);


    // Initiate start and send first character

    i2c_buf[0] = word >> 8;

    i2c_buf[1] = (uint8_t)word;

    i2c_buf_cur = 1;

    i2c_buf_len = 2;

    USCI_B_I2C_masterSendMultiByteStart(I2C_USCI_BASE, i2c_buf[0]);


    // wait for end

    __bis_SR_register(GIE + LPM0_bits);

    __no_operation();

}


///* set/clear some bit to specific register, cannot called in interrupt context */

//void writeBit(uint8_t regAddr, uint8_t bitNum, uint8_t data)

//{

//    uint8_t b = 0;

//    readByte(regAddr, &b);

//    delay_ms(2);

//    b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));

//    writeByte(regAddr, b);

//}


/* read some byte from specific register, cannot called in interrupt context */

void readByte(uint8_t RegAddr, uint8_t* b)

{

while (USCI_B_I2C_isBusBusy(I2C_USCI_BASE));


    // send address

    USCI_B_I2C_setMode(I2C_USCI_BASE, USCI_B_I2C_TRANSMIT_MODE);

    i2c_buf_cur = 1;

    i2c_buf_len = 1;

    USCI_B_I2C_masterSendSingleByte(I2C_USCI_BASE, RegAddr);


    // receive

    USCI_B_I2C_setMode(I2C_USCI_BASE, USCI_B_I2C_RECEIVE_MODE);

    i2c_rx_buf = b;

    i2c_rx_buf_len = 1;

    USCI_B_I2C_masterReceiveSingleStart(I2C_USCI_BASE);


//     wait for end

    __bis_SR_register(GIE + LPM0_bits);

    __no_operation();

}


void readBytes(uint8_t RegAddr, uint8_t length, uint8_t* data)

{

while (USCI_B_I2C_isBusBusy(I2C_USCI_BASE));

    // send address

    USCI_B_I2C_setMode(I2C_USCI_BASE, USCI_B_I2C_TRANSMIT_MODE);

    i2c_buf_cur = 1;

    i2c_buf_len = 1;

    USCI_B_I2C_masterSendSingleByte(I2C_USCI_BASE, RegAddr);


    // receive

    USCI_B_I2C_setMode(I2C_USCI_BASE, USCI_B_I2C_RECEIVE_MODE);

    i2c_rx_buf = data;

    i2c_rx_buf_len = length;

    USCI_B_I2C_masterReceiveMultiByteStart(I2C_USCI_BASE);


    // wait for end

    __bis_SR_register(GIE + LPM0_bits);

    __no_operation();

}


#pragma vector = I2C_USCI_VECTOR

__interrupt void USCI_B0_ISR(void)

{

    switch (__even_in_range(I2C_USCI_IV, 12))

    {

        case USCI_I2C_UCTXIFG:

            if (i2c_buf_cur < i2c_buf_len)

            {

                USCI_B_I2C_masterSendMultiByteNext( I2C_USCI_BASE, i2c_buf[i2c_buf_cur]);

                i2c_buf_cur++;

            }

            else

            {

                USCI_B_I2C_masterSendMultiByteStop(I2C_USCI_BASE);

                //Clear master interrupt status

                USCI_B_I2C_clearInterrupt(I2C_USCI_BASE,

                                          USCI_B_I2C_TRANSMIT_INTERRUPT);

                __bic_SR_register_on_exit(LPM0_bits);

            }

            break;

        case USCI_I2C_UCRXIFG:

            i2c_rx_buf_len--;

            if(i2c_rx_buf_len)

            {

                if(i2c_rx_buf_len== 1)

                {

                    //Initiate end of reception -> Receive byte with NAK

                    *i2c_rx_buf++ = USCI_B_I2C_masterReceiveMultiByteFinish( I2C_USCI_BASE);

                }

                else

                {

                    //Keep receiving one byte at a time

                    *i2c_rx_buf++ = USCI_B_I2C_masterReceiveMultiByteNext( I2C_USCI_BASE);

                }

            }

            else

            {

                //Receive last byte

                *i2c_rx_buf= USCI_B_I2C_masterReceiveMultiByteNext(I2C_USCI_BASE);

                __bic_SR_register_on_exit(LPM0_bits);

            }

            break;

    }

}


MSP430F5529_I2C.h

#ifndef MSP430F5529_I2C_H_

#define MSP430F5529_I2C_H_


void Init_I2C_GPIO(void);

void I2C_init(uint8_t slaveAddress);

void writeByte(uint8_t byte);

void writeWord(uint16_t word);

void readByte(uint8_t RegAddr, uint8_t* b);

void readBytes(uint8_t RegAddr, uint8_t length, uint8_t* data);


#endif /* MSP430F5529_I2C_H_ */


OLED初始化及测试

#include "driverlib.h"

#include "MSP430F5529_I2C.h"

#include "./OLED/OLED.h"


#define MCLK_IN_HZ      25000000


#define delay_us(x)     __delay_cycles((MCLK_IN_HZ/1000000*(x)))

#define delay_ms(x)     __delay_cycles((MCLK_IN_HZ/1000*(x)))


void SystemClock_Init(void)

{

    PMM_setVCore(PMM_CORE_LEVEL_3);     //高主频工作需要较高的核心电压


    //XT1引脚复用

    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);


    //起振XT1

    UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);


    //XT2引脚复用

    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);


    //起振XT2

    UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);


    //XT2作为FLL参考时钟,先8分频,再50倍频 4MHz / 8 * 50 = 25MHz

    UCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);

    UCS_initFLLSettle(25000, 50);


    //XT1作为ACLK时钟源 = 32768Hz

    UCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);


    //DCOCLK作为MCLK时钟源 = 25MHz

    UCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);


    //DCOCLK作为SMCLK时钟源 = 25MHz

    UCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);


    //设置外部时钟源的频率,使得在调用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK时可得到正确值

    UCS_setExternalClockSource(32768, 4000000);

}


int main(void)

{

    WDT_A_hold(WDT_A_BASE);

    SystemClock_Init();


    Init_I2C_GPIO();

    I2C_init(OLED_ADDRESS >> 1);


    __bis_SR_register(GIE);


OLED_Init();

OLED_Clear();

OLED_Display_On();

[1] [2] [3] [4]
关键字:MSP430F5529  库函数  I2C驱动  OLED屏幕 引用地址:MSP430F5529 DriverLib 库函数I2C驱动OLED屏幕

上一篇:MSP432P401R TI Drivers 库函数学习笔记(一)导入工程模板
下一篇:MSP430F5529 DriverLib 库函数学习笔记(十五)SFR 模块

推荐阅读最新更新时间:2024-11-19 17:53

MSP430F5529与常见的矩阵键盘
键盘外观 键盘外观一般是这个样子的,淘宝上常见的有4x4和4x3的,也有不是薄膜而是按键矩阵的键盘,但是原理都大同小异。 键盘原理图 一般来说,键盘有多少行多少列,就有行数+列数这么多的管脚。当按钮按下后,按钮所在行列开关合上,行列之间的管脚就连通了。 单片机实现 4x3键盘 根据键盘的原理图,不难想到我们要用管脚扫描的方式来检测哪个键按下。 将行管脚设为输入,列管脚设为输出(当然也可以反着来),每次只让一个列管脚为高电平,再检测行管脚的电平高低情况,即可检测键盘是哪个键按下了。 初始化管脚 void keyboard_init(){ //设置行管脚为输入 P3DIR &= ~BIT6; //P3.6端口
[单片机]
<font color='red'>MSP430F5529</font>与常见的矩阵键盘
MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 1.通过Timer_A_outputPWM配置产生PWM波 所选输出引脚为P1.2 初始化函数 #define TIMER_PERIOD 12500 void Timer_A_PWM_Init(void) { Timer_A_outputPWMParam htim = {0}; //P1.2复用输出 GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_
[单片机]
<font color='red'>MSP430F5529</font> DriverLib <font color='red'>库函数</font>学习笔记(六)定时器A产生PWM波
消息称因三星良率不佳,LG 本月加入苹果 11 英寸 iPad Pro 用 OLED 屏幕供应
3 月 29 日消息,据韩媒 hankooki 报道,三星显示目前面临苹果 11 英寸 iPad Pro 所用 OLED 屏面板良率不佳的问题,因此 LG 显示已于本月加入了这款面板的供应。 综合IT之家以往报道,今年将发布的苹果 OLED iPad Pro 将使用串联 OLED 结构面板,包含 11 英寸和 13 英寸两个版本,有望 5 月初发布。 此前 11 英寸的显示面板全部由三星显示生产,而 LG 显示于 1 月起开始负责生产 13 英寸面板。不过 LG 显示也通过了 11 英寸面板的认证。 韩媒 hankooki 援引消息人士的话称,目前三星因良率问题无法满足 11 英寸面板的需求,因此 LG 获得了部分订单转移。 LG
[半导体设计/制造]
STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
DS3231简介 DS3231是高精度I2C实时时钟芯片, I2C总线地址为固定的0xD0 内置温度补偿晶体振荡源(TCXO), 降低温度变化造成的晶体频率漂移, 在 范围内误差 ±0.432s/Day. 秒、分、时、星期、日期、月、年, 闰年补偿, 计数年份区间为 两个可编程闹钟, 可以按周或按日重复 方波输出 供电 2.3V – 5.5V (typical: 3.3V) 工作电流 200 – 300 μA 待机电流 110 – 170 μA 电池工作电流 70 – 150 μA 时间保持电池电流 0.84 – 3.5 μA DS3231管脚和典型电路 32KHz - 32.768KHz输出(50%占空比), 漏极
[单片机]
STC8H开发(十三): <font color='red'>I2C</font><font color='red'>驱动</font>DS3231高精度实时时钟芯片
CINNO Research:屏下指纹成了OLED屏幕标配
近日第三方市场调研机构发布了2019年上半年跟搭载屏下指纹技术的智能手机的数据报告。 手机品牌方面:2019年上半年国内搭载屏下指纹技术的智能手机销量为4390万部,其中OPPO以1880万台的屏下指纹手机销量夺得冠军,华为以930万的销量摘得亚军,vivo、小米、魅族紧随其后。 手机解锁方面:根据CINNO Research统计数据,2019第二季度中国市场AMOLED智能手机销量约3292万部,而屏下指纹手机销量约为2847万部,在OLED手机中渗透率已升至86.5%,成为了名副其实的OLED标配功能。 未来销量方面:CINNO Research预测,2019年全球带有屏下指纹功能的OLED手机出货量将较2018年的约
[手机便携]
CINNO Research:屏下指纹成了<font color='red'>OLED</font><font color='red'>屏幕</font>标配
STM32学习之路-用STM32库函数配置RCCc
利用STM32提供的RCC函数配置RCC 定义错误状态变量 ErrorStatus HSEStartUp; 初始化RCC状态寄存器 RCC_DeInit(); 使能高速外部晶振HSE RCC_HSEConfig(RCC_HSE_ON); 参数有3个: RCC_HSE_OFF: HSE oscillator OFF RCC_HSE_ON: HSE oscillator ON RCC_HSE_Bypass: HSE oscillator bypassed with external clock 等待高速外部晶振工作 HSEStartUp = RCC_WaitForHSEStartUp()
[单片机]
<intrins.h>库函数
intrins.h ——Intrinsic functions for C51 常用函数: _nop_() 空操作8051 NOP 指令 _crol_() 字符循环左移 _cror_() 字符循环右移 _irol_() 整数循环左移 _iror_() 整数循环右移 _lrol_() 长整数循环左移 _lror_() 长整数循环右移 函数原型: 说明: #ifndef _A_H // “if not define a.h” 如果不存在a.h #define _A_H // “define a.h” 就引入a.h #endif // 否则不需要引入 此代码为避免头文件重复包含的
[单片机]
鸿海夏普签并购协议 郭台铭“鄙视”OLED屏幕
    腾讯科技讯 据英国路透社报道,在经过长期一波三折之后,周六,中国台湾鸿海集团(大陆业务称为富士康)和日本夏普公司,正式签署了收购协议。鸿海斥资35亿美元获得夏普三分之二股权,成为夏普的新东家。郭台铭也表示,对于重振夏普拥有信心。 由于夏普本财年出现亏损,再加上突然冒出的30多亿美元的潜在债务,鸿海收购夏普的成本比最初降低了大约9亿美元,媒体认为鸿海获得了一个比较实惠的打折价格。 鸿海集团掌门人郭台铭在签约仪式后的新闻发布会上表示,交易完成后,他会尽力保留夏普的工作岗位,不过按照鸿海的惯例,每年也会有3%到5%绩效不佳的员工被解雇。 郭台铭强调说,夏普拥有先进的液晶技术,这将会让夏普实现业务重振。 郭台铭表示
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

更多开源项目推荐
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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