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.

[参考译文] MSP430G2553:连接1.54"Waveshare EPD 与 MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1325497/msp430g2553-interfacing-1-54-waveshare-epd-with-msp430g2553

器件型号:MSP430G2553
主题中讨论的其他器件: MSP430WARE

您好!

我们正在尝试将1.54英寸 EPD 与 MSP430G2553LP 对接。  我们有 IAR 代码。 我在此共享 代码文件以供参考。

//#include "io430.h"
#include "MSP430.h"
#include "stdbool.h"
#include "stdint.h"

#define B (x)(0x01 <<(x))
#define epdcklow P2OUT &=(~B(1))
#define epdckhigh P2OUT |= B(1)
#define epddalow P2OUT &=(~B(2))
#define epdahigh P2OUT |= B(2)
#define epdcslow P1OUT &=(~B(3))
#define epdcshigh P1OUT |= B(3)

#define epddclow P1OUT &=(~B(4))
#define epddchigh P1OUT |= B(4)
#define epdrstlow P1OUT &=(~B(5))
#define epdrsthighP1OUT |= B(5)

#define READ_EPD_BUSY()(P2IN &(B(0))


#define epdbslow P3OUT &= 0xFD
#define epdunnecowhigh P3OUT &= 0x80
#define epdon P2OUT &= 0xbf
#define epdoff P2OUT |= 0x40

#define rfcklow P1OUT &= 0xef
#define rfckhigh P1OUT |= 0x10
#define rfdalow P1OUT &= 0xfb
#define rfdahigh P1OUT |= 0x04
#define rfcslow P1OUT &= 0xf7
#define rfcshigh P1OUT |= 0x08
#define rfon P2OUT &= 0x7f
#define rfoff P2OUT |= 0x80

#define spiromcshigh P3OUT |= 0x01
#define spiromcslow P3OUT &= 0xFE


void InitClk (void);
void InitGpio (void);
void InitEpd (void);
void sendbyte (uint8_t sdbyte);
void epp_send_cmd (int cmd);
void EPD_sendcmddata (int cmd、int data);
空延迟(unsigned int nCount);
void Delaylong (unsigned int n10Count);
extern const unsigned char img1[];
extern const unsigned char img2[];
extern const unsigned char epdinit[];

#define EPD_Y_RAW_Pixels 200
#define EPD_X_RAW_Pixels 200

// const uint8_t GDOControl[]={0x01、(EPD_Y_RAW_Pixels - 1)% 256、
//(EPD_Y_RAW_Pixels - 1)/ 256、0x00};//表示1.54英寸
const uint8_t GDOControl[]={0x01、0xF9、0x00};
const uint8_t EPD_BSSC[]={0x0c、0xd7、0xd6、0x9d};
const uint8_t EPD_SDLP[]={0x3a、0x00};//每个栅极4个虚拟线路
const uint8_t EPD_SGLW[]={0x3b、0x00};//每行2us
const uint8_t EPD_DEMS[]={0x11、0x03};
const uint8_t EPD_SRAMXASE[]={0x44、0x00、0x0F};
const uint8_t EPD_SRAMYASE[]={0x45、0x00、0xf9};
const uint8_t EPD_VCOMVol[]={0x2C、0xA0};
const uint8_t EPD_unknown[]={0x02、0x21、0x83};

// uint8_t EPD_buffer [500];

/*
const uint8_t LUTDefault_FULLE[]={
0x32、//命令
0x50、0xAA、0xAA、0xAA、0xAA、 0xAA、0x55、0x55、0x55、0x55、 0x55、
0xAA、0xAA、0xAA、0xAA、0xAA、 0x11、0x00、0x00、0x00、0x00、 0xFF、
0xFF、0xFF、0xFF、0xFF、0xFF、 0xFF、0xFF、0x01、0x00、0x00、 0x00};
const uint8_t LUTDefault_part[]={
0x32、//命令
0x11、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、
0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、
0x17、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00};
*/
const uint8_t EPD_LUT[]={0x33、0x32、0x66、0x66、0x26、 0x04、0x55、0xAA、
0x08、0x91、0x11、0x88、0x00、 0x00、0x00、0x00、
0x00、0x00、0x19、0x19、0x0a、 0x0A、0x5e、0x1E、
0x1E、0x0a、0x39、0x14、0x00、 0x00、0x00};

void EPD_writeCommandData (const uint8_t * pcd、uint8_t len);

int main (void){
//停止看门狗计时器以防止超时复位
WDTCTL = WDTPW + WDTHOLD;

InitGpio();
InitClk();
InitEpd();

EPD_sendcmddata (0x4e、0x0);
EPD_sendcmddata (0x4f、0x0);
EPD_SEND_cmd (0x24);//写入 RAM
异径管;
epdcslow;
for (unsigned int s = 0;s < 4000;s++){
sendbyte (~img1[s]);

异径管;
while (1){
EPD_sendcmddata (0x22、0xc7);
EPD_SEND_cmd (0x20);
while (READ_EPD_BUSY ())

Delaylong(100);

void EPD_WAIT(){
while (READ_EPD_BUSY ())

void InitEpd (void){
//无符号字符 i;
EPD_SEND_cmd (0x12);
// Delaylong (1);
while (READ_EPD_BUSY ())

/*
EPD_writeCommandData (GDOControl、sizeof (GDOControl));
// EPD_writeCommandData (softstart、sizeof (softstart));
EPD_writeCommandData (EPD_SDLP、sizeof (EPD_SDLP);
EPD_writeCommandData (EPD_SGLW、sizeof (EPD_SGLW);
EPD_writeCommandData (EPD_DEMS、sizeof (EPD_DEMS));
EPD_writeCommandData (EPD_SRAMXASE、sizeof (EPD_SRAMXASE));
EPD_writeCommandData (EPD_SRAMYASE、sizeof (EPD_SRAMYASE));
EPD_writeCommandData (EPD_VCOMVol、尺寸(EPD_VCOMVol));
EPD_writeCommandData (EPD_LUT、sizeof (EPD_LUT));
// EPD_writeCommandData (EPD_UNKNOWN、sizeof (EPD_UNKNOWN));
*/

for (uint8_t i = 0;i <= 0x33;i++){
if ((i == 0x0)||(i == 0x3)||(i == 0x5)||(i == 0x7)||(i == 0x9)||
(i ==0xc)||(i ==0xF)||(i ==0x11)||(i ==0x13)||(i == 0x32){
epddclow;

epdcslow;
sendbyte(epdinit[i]);
异径管;
Eddchigh;
while (READ_EPD_BUSY ())


uint16_t EPD_linebuffer [((EPD_Y_RAW_Pixels / 16)+ 1)];
const uint8_t *EPD_linebuffer8 =(uint8_t *)(&EPD_linebuffer[0]);

const uint8_t _EPD_Stretch LUT[]={0x02、0x02、0x01、0x11、0x12、 0x12、0x22、0x22、
0x66、0x69、0x69、0x59、0x58、 0x99、0x99、0x88、
0x00、0x00、0x00、0x00、0xF8、 0xB4、0x13、0x51、
0x35、0x51、0x51、0x19、0x01、 0x00}

epp_stretch (uint8_t 字节)
{
uint8_t buf[2];
buf[0]=_EPD_STRETCH_LUT[(byte & 0x0F)];
buf[1]=_EPD_STRETCH_LUT[(字节>> 4)];
返回*((uint16_t *) buf);

void InitGpio (void){
// rfcslow;
// rfcklow;
// rfdalow;
// spiromcslow;
// epdunnecowhigh;
// epdbslow;
///
// rfoff;
P1DIR = B (3)| B (4)| B (5);
P2DIR = B (1)| B (2);
P1SEL = 0x00;
P1SEL2 = 0x00;
P2SEL = 0x00;
P2SEL2 = 0x00;
P3SEL = 0x00;
P3SEL2 = 0x00;
Delaylong(1);
*食喉管;
Delaylong(1);
麻醉剂低;
Delaylong(1);
*食喉管;

void InitClk (void){
DCOCTL = 0x0000;
BCSCTL1 = CALBC1_16MHZ;//设置范围
DCOCTL = CALDCO_16MHz;

BCSCTL3 |= LFXT1S_2;/* LFXT1的模式2:VLO */
IFG1 &=! (OFIFG);
延迟(512);
BCSCTL1 |= DIVA_0;/* ACLK 分频器3:/8 */

void epp_sendcmddata (int cmd、int data){
epddclow;
epdcslow;
sendbyte (cmd);
Eddchigh;
sendbyte (data);
异径管;

void epp_send_cmd (int cmd)
{
epddclow;
epdcslow;
sendbyte (cmd);
异径管;
Eddchigh;

void sendbyte (uint8_t sdbyte){
亚麻布克洛;
if (sdbyte & 0x80) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x40) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x20) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x10) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x08) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x04) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x02) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x01) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;

void EPD_writeCommandData (const uint8_t *pcd、uint8_t len){
EPD_WAIT();
epddclow;
epdcslow;
sendbyte (* PCD++);
Eddchigh;
对于(uint8_t i = 0;I < len - 1;I++)
sendbyte (* PCD++);
异径管;
ASM ("NOP");
ASM ("NOP");

空延迟(unsigned int nCount){
用于(;nCount !=0;nCount --){
ASM ("NOP");
ASM ("NOP");
ASM ("NOP");
ASM ("NOP");

void Delaylong (unsigned int n10Count){
无符号字符 I;
while (n10Count --){
对于(I=0;I<10;I++){
延迟(10000);


IAM 无法编译代码。 任何人可以指导我完成该规范并帮助我解决问题。

提前感谢您。

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

    您好、 

    您正在使用这项权利吗?  1.54英寸电子纸模块手册- Waveshare Wiki

    ---

    IAM 无法编译代码。

    编译器错误是什么?

    ---

    您可以尝试将 示例代码 直接粘贴到 SDK 示例代码中。  

    这款1.54英寸电子纸模块使用 SPI 作为通信接口。

    该示例代码使用的是软件 SPI。

    此致、

    赫利克

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

    感谢您的答复。

    现在代码正在编译、但我们无法在 EPD 上看到图像。 您能不能为我们介绍一下 MSP430G2553的 EPD 引脚配置。 它将对我们有很大帮助。  

    提前感谢您。  

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

    您好、 

    EPD 需要6个 GPIO ,并检查  main ()中调用的函数" InitGpio()"。

    确保函数"EPD_writeCommandData()"工作正常。 如果您有逻辑分析仪、则可以监控 硬件上的 SPI 通信。

    ----------------

    有关 MSP430演示代码的更多信息、请参阅 MSP430 SDK:

    尝试以下 MSP430SDK 文件夹中的示例代码: *\ti\msp\MSP430Ware_3_80_14_01\examples\devices\MSP430G2xx\MSP430G2xx3_MSP430Ware\C Code_Examples

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

    感谢您发送编修。

    我在这里共享 InitGpio()函数。 请引导我们。

    void InitGpio (void){
    // rfcslow;
    // rfcklow;
    // rfdalow;
    // spiromcslow;
    // epdunnecowhigh;
    // epdbslow;
    ///
    // rfoff;
    P1DIR = B(4)| B(5)| B(7);
    P2DIR = B (0)| B (1);
    P1SEL = 0x0;
    P1SEL2 = 0x0;
    P2SEL = 0x0;
    P2SEL2 = 0x0;
    P3SEL = 0x0;
    P3SEL2 = 0x0;
    Delaylong(1);
    *食喉管;
    Delaylong(1);
    麻醉剂低;
    Delaylong(1);
    *食喉管;

    我们已将 EPD 连接至 MSpG2553、如下所述、

    EPD  - MSP430G2553ET

    忙  -  P2.2

    重置-  P2.1

    直流   -  P1.4

    CS   -  P2.0

    CLK-P1.5     

    DIN  -   P1.7

    谢谢你。

    联系我们@ venkat.pothumudi@tracklynk.com

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

    您好、 

    您需要自行检查此代码。

     如果您有逻辑分析仪、则可以监控 硬件上的 SPI 通信。

    1.检查初始化是否成功

    2.检查 SPI 3条线路正常 工作,命令正确。

    3.检查绘图命令是否有效。

    -------------------------------------------------------

    我要提一个小窍门:MSP340应从 EPD 接收到 BUSY 信号、对于 MSP430、BUSY 信号应该是一个输入信号。

    请参阅 MSP430的用户指南: https://www.ti.com/lit/pdf/slau144

    在347页上、PxDIR = 1为输出。

    在您发送给我的演示代码"P2DIR = B (0)| B (1);"中、该代码将 P2.0和 P2.1设置为输出、将 P2.2设置为输入(默认)。

    -------------------------------------------------------

    有关 GPIO 操作的更多信息、请参阅 SDK 演示代码:

    MSP430SDK: *\ti\msp\MSP430Ware_3_80_14_01\examples\devices\MSP430G2xx\MSP430G2xx3_MSP430G2xx\C Code_Examples

    此致、

    赫利克