This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430G2553:通过 I2C 连接 LCD

Guru**** 1555210 points
Other Parts Discussed in Thread: MSP430G2553, PCF8574, PCF8574A
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/926115/ccs-msp430g2553-interfacing-lcd-via-i2c

器件型号:MSP430G2553
主题中讨论的其它部件:PCF8574PCF8574A

工具/软件:Code Composer Studio

大家好 、我是新手。 我尝试通过 PCF8574将1602A LCD 显示屏与 MSP430G2553相连。 当我运行代码时、不会发生任何情况:

#include 

unsigned int *ptxData;
unsigned int count = 0;
//[0..3]->加电,[4..5]->功能集,[6..7]->显示关闭,光标关闭,闪烁//
[8..9]->清除屏幕,[10..11]->右,请勿移动,[12..13]->显示打开,光标打开
//[0x02]
,0x02[0x02],0x02[0x14],0x02],0x02[0x20] 0x00、0x00、0x08、0x00、0x01、 0x00、0x06、0x00、0x0F、0x24、 0x22};

void main (){
WDTCTL = WDTPW | WDTHOLD;

//表示 i2c 引脚
P1SEL = 0xC0;
P1SEL2 = 0xC0;

// i2c 配置
UCB0CTL1 |= UCSWRST;
UCB0CTL0 = UCMST | UCMODE_3 | UCSYNC;
UCB0CTL1 = UCSSEL_3;
UCB0BR0 = 12;
UCB0BR1 = 0;
UCB0I2CSA = 0x27;//从器件地址
UCB0CTL1 &=~UCSWRST;

//启用 TX 中断
IE2 |= UCB0TXIE;
enable_interrupts ();

//开始发送数据
ptxData = txData;
UCB0CTL1 |= UCTR + UCTXSTT;

while (1);
}

#pragma vector = USCIAB0TX_vector
_中断 void USCIAB0TX_ISR (void){
//逐一发送 txData 元素
UCB0TXBUF =*ptxData;
count++;
*ptxData++;

//如果 txData 结束,从开始
如果(count = 16){
计数= 0;
ptxData-= 16;
}
}

我遗漏了什么、您能为我提供帮助吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TxData[]数组的来源是什么? 我希望这是一个引脚设置序列、具体取决于 LCD 与 PCF8574的连接方式。 由于我不知道这些设置、因此我不知道如何准确地解释它们。

    需要记住的一点是、控制器(假设是 HD44780)在序列中的某些点需要延迟、而该代码似乎没有这样做。

    此外、请查看您的电路板上的芯片、看看它是 PCF8574还是 PCF8574A。 前者的地址在0x20-0x27范围内、后者在0x38-0x3F。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我更新了代码并添加了注释。 TxData 数组包含 LCD 指令、例如功能集、显示开/关等 从机地址正确。 但我无法添加延迟。 我尝试 以下操作:

    #pragma vector = USCIAB0TX_Vector
    _中断 void USCIAB0TX_ISR (void){
    //逐一发送 txData 元素
    UCB0TXBUF =*ptxData;
    count++;
    *ptxData++;
    
    for (int i=0;i<10000;i++){}
    
    //如果 txData 结束,从开始
    如果(count = 16){
    计数= 0;
    ptxData-= 16;
    }
    } 

    当我调试这个代码时、我看到针对循环被跳过。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不建议针对循环执行延迟。 请改用__delay_cycles (UINT32_T)。 由于您尚未更改时钟、因此一个周期大约为1 μ s。

    如果您确定地址和数据流正确、我推迟。 但是(a)我看不到任何会摆动 EN 引脚的东西(b) GitHub 上的一些/大多数示例似乎认为数据字节位于端口的高位、 不是低位(c) PCF8574数据表(SCPS068J)第8.3.1节似乎表明只有事务的第一个字节可用、其余字节将被忽略。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如何切换 E?

    您能否在此处为 GitHub 上的某些示例添加链接? 我找不到任何内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对 PCF 的每次写入相当于对端口寄存器(字节)的写入。 我希望每个字节能看到4个事务:(a)(高位+ en=1)(b)(高位+ en=0)(c)(低位+ en=1)(d)(低位+ en=0)。 [编辑:D/C 位也适合此处的某个位置。]

    您的第一站可能是制造商的网站。 其中一些比其他器件更好、但至少您应该能够找到显示引脚布线方式的原理图/图。 (我不知道市场上有多少变体。)

    我在 GitHub 中搜索"LCD1602 I2C"、并获得了一系列点击结果。 下面是一个:

    https://github.com/Szpillmann/LCD1602A/blob/master/LCD1602a.CPP

    我所看到的任何一个都没有较低(I2C)层、只是对其进行调用(在"i2c_write"级别)。

    我没有找到专门用于 MSP430的任何器件。 这里的这个人在使用 F5529、但 I2C 单元有点相似。 我想我记得他成功了,但重新阅读最后一句显然他没有成功。 现在我想知道他是否遇到了每事务1字节的限制。 不管怎样、它具有我所期望的部分(LCD 和 I2C 层)、它们可能只需要稍微重新封装。

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/907530

    示例就在这里。 "I2C_02"似乎与您的 PCF 芯片的表弟一起工作。

    http://dev.ti.com/tirex/explore/node?node=ALFfIDtjUH-HwRytz.WJPQ__IOGqZri__LATEST

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我用几种方法编写了字符 LCD 的代码、但始终通过直接 GPIO 连接而不是使用 I2C I/O 扩展器。 这会使它变得更加困难。

    此外、我无法这么说、因为当您说您使用 I/O 扩展器连接 LCD 时、您不提供有关连接的详细信息。 控制信号是否已连接?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我建议采用分治法:首先让 I/O 扩展器工作。 您需要一个将字节写入输出的函数。 在您开始工作后、您可能会担心与 LCD 的对话。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    5V 至 VCC、GND 至 GND、P1.7至 SDA、P1.6至 SCL。 这些是唯一的连接。

    感谢您的建议、我将更仔细地阅读文档并分析您提供的代码。 我希望我最终可以在屏幕上打印"Hello World"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SDA 和 SCL 上没有上拉电阻器达到3.3V? (MSP430 Vcc)没有到 LCD 的连接?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我是否必须向 SDA 和 SCL 添加电阻器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不知道。 您购买了具有 I2C 接口的显示屏、因此您知道自己拥有的器件。 我不是。 您必须阅读随附的文档、因为我没有它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sun创始人(以及其他人)销售 LCD1602、QAPASS 位于 LCD 背面、MH 位于背包上。 其 Wiki 页面指向 Arduino 库、其中包括:

    #define LCD_背 光0x08
    #define EN B00000100 //使能位
    #define RW B00000010 //读取/写入位
    #define Rs B00000001 //寄存器选择位
    

    http://wiki.sunfounder.cc/index.php?title=I%C2%B2C_LCD1602

    这是一个实际的原理图、它与我可以检查的内容相匹配。 它包括 I2C 上的上拉电阻器。 这些上拉电阻将达到5V、这可能适合 MSP430、也可能不适合 MSP430、但我想如果您尚未油炸过任何东西、您可以带走它。

    它还在端口的高位显示了 D7-D4。

    https://www.playembedded.org/blog/hd44780-backpack-stm32/