MSP430学习笔记(四)丨I2C通信(MSP430F5529驱动OLED显示屏)_msp430的软件iic通信控制oled

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

​  笔者学习采用单片机型号为MSP430F5529,使用MSP-EXP430F5529LP开发板。
​  笔者拥有一定的STM32基础,在学习MSP430的过程中,最开始苦于没有合适的OLED显示驱动代码,所以花了很多时间钻研。综合网上的各种代码,笔者认为江协科技的STM32课程中提供的OLED代码使用方便,代码逻辑清晰便于学习和使用,所以花了很多时间来研究那一版的代码写法和MSP430的I2C通信。本篇文章主要实现MSP430的基于硬件I2C的主模式信息传输。


一、USCI_B——I2C主模式操作

1.1 函数调用顺序说明

​  为了驱动主控模块,需要按照以下顺序调用API:

  1. USCI_B_I2C_initMaster() - 初始化USCI_B_I2C主控模块。
  2. USCI_B_I2C_setSlaveAddress() - 设置主控将与之通信的从设备地址。这里的从设备地址是不加读写操作位的从设备地址。MSP430的库函数会在时序开头的起始条件后根据传输/接收模式自动拼接设备地址+读写位的第一个字节。
  3. USCI_B_I2C_setMode() - 选择操作模式(发送或接收)。
  4. USCI_B_I2C_enable() - 启用USCI_B_I2C模块。
  5. USCI_B_I2C_enableInterrupt()(如果使用中断) - 启用USCI_B_I2C中断。如果需要传输数据,则需要使能传输中断;如果需要接收数据,则需要使能接收中断。

​  接下来可以根据需要调用传输或接收相关的API。

​  用户首先需要调用USCI_B_I2C_initMaster()来初始化USCI_B_I2C模块并将其配置为主控。该函数将设置时钟和数据速率。然后使用USCI_B_I2C_setSlaveAddress来设置主控与之通信的从设备地址。接下来使用USCI_B_I2C_setMode选择操作模式(发送或接收)。现在可以使用USCI_B_I2C_enable启用USCI_B_I2C模块。建议在启用中断之前启用USCI_B_I2C模块。在启用中断(如果有)后,此时可以发起任何数据的发送或接收。

​  可以通过调用以下列出的相关API来在总线上发起传输。如果设备处于等待IFG标志设置的状态中,可以使用包含超时的API,以避免陷入无限循环。

1.2 不同情况下的函数调用顺序

​  主控单字节发送:

  • USCI_B_I2C_masterSendSingleByte()

​  主控多字节发送(之后的三个函数需要在中断中调用):

  • USCI_B_I2C_masterSendMultiByteStart()
  • USCI_B_I2C_masterSendMultiByteNext()
  • USCI_B_I2C_masterSendMultiByteFinish()
  • USCI_B_I2C_masterSendMultiByteStop()

​  主控单字节接收:

  • USCI_B_I2C_masterReceiveSingleStart()
  • USCI_B_I2C_masterReceiveSingle()

​  主控多字节接收(之后的三个函数需要在中断中调用):

  • USCI_B_I2C_masterReceiveMultiByteStart()
  • USCI_B_I2C_masterReceiveMultiByteNext()
  • USCI_B_I2C_masterReceiveMultiByteFinish()
  • USCI_B_I2C_masterReceiveMultiByteStop()

​  带超时的主控单字节发送:

  • USCI_B_I2C_masterSendSingleByteWithTimeout()

​  带超时的主控多字节发送:

  • USCI_B_I2C_masterSendMultiByteStartWithTimeout()
  • USCI_B_I2C_masterSendMultiByteNextWithTimeout()
  • USCI_B_I2C_masterReceiveMultiByteFinishWithTimeout()
  • USCI_B_I2C_masterSendMultiByteStopWithTimeout()

​  带超时的主控单字节接收:

  • USCI_B_I2C_masterReceiveSingleStartWithTimeout()

​  对于基于中断的传输,用户必须为USCI_B_I2C设备注册中断处理程序并启用USCI_B_I2C中断。

在MSP430中,超时(Timeout)是指在特定时间内未能完成某个操作或接收到预期的响应。它通常用于处理通信协议中的错误或异常情况,以防止程序陷入无限等待或死锁状态。
  在某些通信协议中,例如I2C或UART,设备之间的通信可能会发生错误或超时。当发生这种情况时,为了确保程序的正常运行,可以设置一个超时机制。超时机制会在设定的时间内检测是否收到预期的响应,如果超过设定的时间仍未收到响应,则认为操作失败或通信出现问题。
  超时可以根据具体应用和通信协议的要求进行设置。通常,可以使用定时器或计数器来实现超时功能。在超时期间,程序可以执行相应的错误处理或尝试重新发送数据。
  超时的设定取决于通信环境、通信速度和所需的响应时间。通过合理设置超时时间,可以提高系统的鲁棒性和可靠性,避免长时间的等待或阻塞情况,从而提高程序的性能和响应能力。

二、I2C通信库函数

// 初始化I2C主模块
void USCI\_B\_I2C\_initMaster(uint16\_t baseAddress, USCI_B_I2C_initMasterParam \*param);

// 初始化I2C从模块
void USCI\_B\_I2C\_initSlave(uint16\_t baseAddress, uint8\_t slaveAddress);

// 启用I2C模块
void USCI\_B\_I2C\_enable(uint16\_t baseAddress);

// 禁用I2C模块
void USCI\_B\_I2C\_disable(uint16\_t baseAddress);

// 设置I2C主模块将在总线上放置的地址
void USCI\_B\_I2C\_setSlaveAddress(uint16\_t baseAddress, uint8\_t slaveAddress);

// 设置I2C设备的模式
void USCI\_B\_I2C\_setMode(uint16\_t baseAddress, uint8\_t mode);

// 从I2C模块发送一个字节
void USCI\_B\_I2C\_slavePutData(uint16\_t baseAddress, uint8\_t transmitData);

// 接收已发送到I2C模块的字节
uint8\_t USCI\_B\_I2C\_slaveGetData(uint16\_t baseAddress);

// 指示I2C总线是否忙
uint8\_t USCI\_B\_I2C\_isBusBusy(uint16\_t baseAddress);

// 【已弃用】该功能可能在将来的版本中被删除。指示I2C模块是否忙
uint8\_t USCI\_B\_I2C\_isBusy(uint16\_t baseAddress);

// 指示是否已发送停止位
uint8\_t USCI\_B\_I2C\_masterIsStopSent(uint16\_t baseAddress);

// 指示是否已发送起始位
uint8\_t USCI\_B\_I2C\_masterIsStartSent(uint16\_t baseAddress);

// 主模块用于启动起始位的函数
void USCI\_B\_I2C\_masterSendStart(uint16\_t baseAddress);

// 启用单独的I2C中断源
void USCI\_B\_I2C\_enableInterrupt(uint16\_t baseAddress, uint8\_t mask);

// 禁用单独的I2C中断源
void USCI\_B\_I2C\_disableInterrupt(uint16\_t baseAddress, uint8\_t mask);

// 清除I2C中断源
void USCI\_B\_I2C\_clearInterrupt(uint16\_t baseAddress, uint8\_t mask);

// 获取当前I2C中断状态
uint8\_t USCI\_B\_I2C\_getInterruptStatus(uint16\_t baseAddress, uint8\_t mask);

// 从主模块向从模块发送单个字节
void USCI\_B\_I2C\_masterSendSingleByte(uint16\_t baseAddress, uint8\_t txData);

// 从主模块向从模块发送单个字节,并带有超时功能
bool USCI\_B\_I2C\_masterSendSingleByteWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);

// 从主模块启动多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteStart(uint16\_t baseAddress, uint8\_t txData);

// 从主模块启动多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteStartWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);

// 从主模块继续多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteNext(uint16\_t baseAddress, uint8\_t txData);

// 从主模块继续多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteNextWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);

// 从主模块完成多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteFinish(uint16\_t baseAddress, uint8\_t txData);

// 从主模块完成多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteFinishWithTimeout(uint16\_t baseAddress, uint8\_t txData, uint32\_t timeout);

// 从主模块发送停止位以结束多字节传输到从模块
void USCI\_B\_I2C\_masterSendMultiByteStop(uint16\_t baseAddress);

// 从主模块发送停止位以结束多字节传输到从模块,并带有超时功能
bool USCI\_B\_I2C\_masterSendMultiByteStopWithTimeout(uint16\_t baseAddress, uint32\_t timeout);

// 从主模块开始多字节接收
void USCI\_B\_I2C\_masterReceiveMultiByteStart(uint16\_t baseAddress);

// 从主模块逐个字节开始多字节接收
uint8\_t USCI\_B\_I2C\_masterReceiveMultiByteNext(uint16\_t baseAddress);

// 从主模块完成多字节接收
uint8\_t USCI\_B\_I2C\_masterReceiveMultiByteFinish(uint16\_t baseAddress);

// 从主模块完成多字节接收,并带有超时功能
bool USCI\_B\_I2C\_masterReceiveMultiByteFinishWithTimeout(uint16\_t baseAddress, uint8\_t \*rxData, uint32\_t timeout);

// 从主模块发送停止位以结束多字节接收
void USCI\_B\_I2C\_masterReceiveMultiByteStop(uint16\_t baseAddress);

// 从主模块开始单字节接收
void USCI\_B\_I2C\_masterReceiveSingleStart(uint16\_t baseAddress);

// 从主模块开始单字节接收,并带有超时功能
bool USCI\_B\_I2C\_masterReceiveSingleStartWithTimeout(uint16\_t baseAddress, uint32\_t timeout);

// 从I2C主模块接收已发送到其的字节
uint8\_t USCI\_B\_I2C\_masterReceiveSingle(uint16\_t baseAddress);

// 返回用于DMA模块的I2C接收缓冲区的地址
uint32\_t USCI\_B\_I2C\_getReceiveBufferAddressForDMA(uint16\_t baseAddress);

// 返回用于DMA模块的I2C发送缓冲区的地址
uint32\_t USCI\_B\_I2C\_getTransmitBufferAddressForDMA(uint16\_t baseAddress);


三、OLED驱动代码

  • OLED.h
/\*
 \* OLED.h
 \*
 \* Created on: 2023年7月12日
 \* Author: Include everything
 \*/

#ifndef HARDWARE\_OLED\_H\_
#define HARDWARE\_OLED\_H\_

void OLED\_Init(void);
void OLED\_Clear(void);
void OLED\_ShowChar(uint8\_t Line, uint8\_t Column, char Char);
void OLED\_ShowString(uint8\_t Line, uint8\_t Column, char \*String);
void OLED\_ShowNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length);
void OLED\_ShowSignedNum(uint8\_t Line, uint8\_t Column, int32\_t Number, uint8\_t Length);
void OLED\_ShowHexNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length);
void OLED\_ShowBinNum(uint8\_t Line, uint8\_t Column, uint32\_t Number, uint8\_t Length);

#endif /\* HARDWARE\_OLED\_H\_ \*/


  • OLED_Font.h
/\*
 \* OLED\_Font.h
 \*
 \* Created on: 2023年7月12日
 \* Author: Include everything
 \*/

#ifndef HARDWARE\_OLED\_FONT\_H\_
#define HARDWARE\_OLED\_FONT\_H\_

/\*OLED字模库,宽8像素,高16像素\*/
const uint8\_t OLED_F8x16[][16]=
{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0

    0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1

    0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2

    0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,
    0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3

    0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,
    0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4

    0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,
    0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5

    0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,
    0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6

    0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7

    0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,
    0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8

    0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,
    0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9

    0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,
    0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//\* 10

    0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,
    0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14

    0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,
    0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15

    0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
    0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16

    0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
    0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17

    0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
    0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18

    0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
    0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19

    0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
    0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20

    0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
    0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21

    0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
    0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22

    0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
    0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23

    0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
    0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24

    0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
    0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25

    0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,
    0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26

    0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
    0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27

    0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,
    0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28

    0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
    0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29

    0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,
    0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30

    0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,
    0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31

    0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,
    0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32

    0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,
    0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33

    0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,
    0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34

    0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
    0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35

    0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,
    0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36

    0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
    0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37

    0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
    0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38

    0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,
    0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39

    0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
    0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40

    0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
    0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41

    0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,
    0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42

    0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,
    0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43

    0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,
    0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44

    0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,
    0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45

    0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,
    0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46

    0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
    0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47

    0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
    0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48

    0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
    0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49

    0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,
    0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50

    0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,
    0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51

    0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,
    0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52

    0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
    0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53

    0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,
    0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54

    0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,
    0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55

    0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,
    0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56

    0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,
    0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57

    0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,
    0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58

    0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,
    0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59

    0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60

    0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
    0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61

    0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//\_ 63

    0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64

    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
    0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65

    0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,
    0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66

    0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
    0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67

    0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,
    0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68

    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
    0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69

    0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,
    0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70

    0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
    0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71

    0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,
    0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72

    0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,
    0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73

    0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,
    0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74

    0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,
    0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75

    0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,
    0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76

    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
    0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77

    0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
    0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78

    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
    0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79

    0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,
    0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80

    0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,
    0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81

    0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
    0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82

    0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
    0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83

    0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,
    0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84

    0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
    0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85

    0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
    0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86

    0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,
    0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87

    0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
    0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88

    0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
    0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89

    0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
    0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90

    0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,
    0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91

    0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92

    0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,
    0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93

    0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};

#endif /\* HARDWARE\_OLED\_FONT\_H\_ \*/


  • OLED.c
/\*
 \* OLED.c
 \*
 \* Created on: 2023年7月12日
 \* Author: Include everything
 \*/

#include <driverlib.h>
#include "OLED\_Font.h"

//#define I2C\_USCI\_IV UCB0IV

static uint8\_t LastByteFlag = 0;
static uint8\_t I2C_Tx_BufData = 0;      // 数据缓冲字节,供中断函数使用

/\*引脚初始化\*/
void OLED\_I2C\_Init(void)
{
    GPIO\_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN0 | GPIO_PIN1);

    USCI_B_I2C_initMasterParam USCI_B_I2C_InitStructure;

    USCI_B_I2C_InitStructure.dataRate = USCI_B_I2C_SET_DATA_RATE_400KBPS;
    USCI_B_I2C_InitStructure.i2cClk = UCS\_getSMCLK();
    USCI_B_I2C_InitStructure.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;

    USCI\_B\_I2C\_initMaster(USCI_B0_BASE, &USCI_B_I2C_InitStructure);

    // 设置从机地址,之后的时序中不需要再发送从机地址
    USCI\_B\_I2C\_setSlaveAddress(USCI_B0_BASE, 0x78 >> 1);

    USCI\_B\_I2C\_setMode(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_MODE);
    USCI\_B\_I2C\_enable(USCI_B0_BASE);

    // 使能传送中断,用来接收从机的响应信号
    USCI\_B\_I2C\_clearInterrupt(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);
    USCI\_B\_I2C\_enableInterrupt(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);
}

/\*\*
 \* @brief I2C发送一个字节
 \* @param Byte 要发送的一个字节
 \* @retval 无
 \*/
void OLED\_I2C\_SendByte(uint8\_t Byte)
{


![img](https://img-blog.csdnimg.cn/img_convert/1ea07b7d6b1d580c9a6a29e146eed67f.png)
![img](https://img-blog.csdnimg.cn/img_convert/b46c5e6a561cb0e0242bf89c5e893bc3.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

机的响应信号
    USCI\_B\_I2C\_clearInterrupt(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);
    USCI\_B\_I2C\_enableInterrupt(USCI_B0_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT);
}

/\*\*
 \* @brief I2C发送一个字节
 \* @param Byte 要发送的一个字节
 \* @retval 无
 \*/
void OLED\_I2C\_SendByte(uint8\_t Byte)
{


[外链图片转存中...(img-RlSsJmws-1715890207728)]
[外链图片转存中...(img-oN91flKQ-1715890207728)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSP430F5529是一款广泛应用于嵌入式系统开发的微控制器,而OLED(Organic Light Emitting Diode)则是一种使用有机材料制造的发光二极管。下面是关于如何驱动MSP430F5529OLED之间的通信的解释。 首先,我们需要了解MSP430F5529的GPIO(General Purpose Input/Output)功能。作为一款32位微控制器,MSP430F5529配备了多个GPIO引脚,用于与外部设备进行通信控制。在驱动OLED之前,我们需要将其中几个GPIO引脚作为数据线和控制线连接到OLED上。 其次,我们需要了解OLED的工作原理和通信协议。OLED通常采用I2C或SPI协议进行数据传输和控制。对于MSP430F5529来说,SPI协议是一个更常见,更容易实现的选择。因此,我们将使用SPI协议来驱动OLED。 接下来,我们需要编写MSP430F5529上的驱动程序。首先,我们需要初始化SPI通信,并设置MSP430F5529的SPI模式为主设备模式。然后,我们需要设置每个连接到MSP430F5529的GPIO引脚的功能和方向。其中,一个引脚用于发送数据(MOSI引脚),一个引脚用于接收数据(MISO引脚),一个引脚用于时钟同步(SCLK引脚),一个引脚用于选择OLED(CS引脚),还有一个引脚用于控制OLED的电源(PS引脚)。 在程序初始化后,我们可以向OLED发送特定指令,例如屏幕清除、画线等。为此,我们需要编写SPI发送函数,将数据和指令传输到OLED,然后OLED根据指令进行操作。 总结:要驱动MSP430F5529OLED,我们需要先了解MSP430F5529的GPIO功能和OLED通信协议。然后,我们需要编写MSP430F5529驱动程序,初始化SPI通信,设置GPIO引脚功能和方向,并编写SPI发送函数来与OLED进行通信控制。同时,还可以根据需要发送特定的指令来操作OLED屏幕。这样,我们就能够实现MSP430F5529OLED之间的驱动

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值