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/MSP430FR5969:SSD1306 OLED

Guru**** 2614265 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/660159/ccs-msp430fr5969-ssd1306-oled

部件号:MSP430FR5969

工具/软件:Code Composer Studio

大家好,

我正在尝试将MCU MSP430FR5969连接到SSD1306 OLED (通过I2C通信)。 当我逐步调试时,它可以工作,但当我尝试一次运行所有时,没有任何反应。 请有人来指导我吗? 我被卡住了。 非常感谢。

#include <MSP40.0.h>

const unsigned char Init[]={0xAE,0x81,0x07,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,
0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA6,0xA4,0xAF,0xA5};
// const unsigned char Mod[]={0xA5};

void main (void){
WDTCTL = WDTPW | WDTHOLD;
P1SEL1 || BIT6 + BIT7;
P1DIR |=BIT0;
P1OUT &=~BIT0;
PM5CTL0 &=~LOCKLPM2;

UCB0CTLW0 |= UCSWRST;
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC | UCSSEL_2; // I2C主模式
UCB0CTLW1 = UCASTP_2;//使用SMCLK,保持SW重置
UCB0BR0=0x40;
UCB0I2CSA = 0x3C; //地址
UCB0CTL1 &=~UCSWRST;
UCB0IE |= UCTXIE;

而(1){
__DELAY周期(20);
While (UCB0CTL1和UCTXSTP);
UCB0CTLW0 |= UCTR | UCTXSTT;
__bis_sr_register(LPM0_bits | GIE);
}
{//FIN main
////////////////////////////////////////////////////////////
#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void){
SWITCH(__EIN_RANGE(UCB0IV, 0x1E))/USI_I2C_UCBIT9IFG)){

案例USI_NONE: 中断; //矢量0:无中断
案例USI_I2C_UCALIFG:中断; //矢量2:ALIFG
案例USI_I2C_UCNACKIFG: //矢量4:NACKIFG
UCB0CTL1 || UCTXSTT; // I2C启动条件-如果不符合,则重新发送启动
中断;
案例USI_I2C_UCSTIFG:
中断; //引导程序6:开始
案例USI_I2C_UCSTPIFG:
UCB0IFG &=~UCSTPIIFG;
中断; //矢量8:检测到停止
案例USI_I2C_UCRXIFG3:中断; //矢量10:RXIFG3
案例USI_I2C_UCTXIFG3:中断; //矢量12:TXIFG3
案例USI_I2C_UCRXIFG2:中断; //矢量14:RXIFG2
案例USI_I2C_UCTXIFG2:中断; //矢量16:TXIFG2
案例USI_I2C_UCRXIFG1:中断; //矢量18:RXIFG1
案例USI_I2C_UCTXIFG1:中断; //矢量20:TXIFG1
案例USI_I2C_UCRXIFG0:
中断; //矢量22:RXIFG0主控0
案例USI_I2C_UCTXIFG0:
P1OUT ^= BIT0;
//__delay_cycles (2万);
UCB0TXBUF = 0x80;
无符号int c;
对于(c=0; c< 32; c++){
P1OUT ^= BIT0;
//__bis_sr_register (LPM0_bits + GIE);
UCB0TXBUF =初始化[c];
//__bis_sr_register(LPM0_bits + GIE);
}
//UCB0CTL1 |= UCTXSTP;
//UCB0IFG &=~ UCTXIFG;
中断; //矢量24:TXIFG0主控0

案例USI_I2C_UCBCNTIFG: //矢量26:BCNTIFG
//P1OUT ^= BIT0; //在WFP 1.0 上切换LED
中断;
案例USI_I2C_UCCLTOIFG:中断; //向量28:时钟低超时
案例USI_I2C_UCBIT9IFG:中断; //矢量30:第9位
默认值:break;
}

} 

顺祝商祺

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

    您好,Darwin:

    它在哪里卡住?

    尝试增加延迟。 调试计时和空闲运行计时通常不同,您可能会陷入这种While循环。

    另外,在插入代码时,请使用代码格式化板;-)

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

    我尝试了您的建议,但仍然不起作用。
    我不理解的是,在翻译后
    案例USI_I2C_UCTXIFG0:....
    发生什么事了?

    也许,您可以与我分享一个正在工作的I2C代码示例,以便我更好地指导我。 其实我是MCU的初学者。

    此致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Darwin:
    您从哪里获取上述代码?

    该案例下面的行似乎是切换GPIO (可能带有LED),然后传输0x80 (寄存器地址?),然后在开始时传输阵列的内容。


    尝试取消注释第61行,查看启动板上的LED是否闪烁。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否使用上拉电阻器? 因为这个问题听起来像是线路被压低了。 如果没有将I2C线路与4.7K电阻器绑定到高电阻。

    这是i2c上的AppNote    和工作示例代码,可在dev.ti.com上的资源资源管理器中找到  

    #include <MSP40.08.h>
    
    const unsigned char TXData[]={ 0xA1, 0xB1, 0xC1, 0xD1};
    const unsigned char SlaveAddress[]={ 0x0A, 0x0B, 0x0C, 0x0D };
    volatile
    
    
    
    
    
    
    GPIO char TXByteCtr;volatile unsigned SlaveFlag =0;int main(void){ DTTCTTL = WDTPBL1;配置WITPBL1; SE| WITPBD| WITPBD| WITB1;配置WITL=
    // I2C引脚
    
    //禁用GPIO通电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    //为I2C模式UCB0CTLW0 =
    UCSWRST配置USSCI_B0; //将eUSCI_B置于重置状态
    UCB0CTLW0 |= UCMODE_3 | UMST | UCSSEL__SMCLK;// I2C主模式,SMCLK
    UCB0BRW = 0x8; //波特率= SMCLK / 8
    UCB0CTLW0 &=~UCSWRST; //清除重置寄存器
    UCB0IE |= UCTXIE0 | UCNACKIE; //传输和nack中断启用
    
    SlaveFlag =0; //初始化SlaveFlag
    
    ,同时(1){
    
    __DELAY周期(1000); //传输之间的延迟
    UCB0I2CSA = SlaveAddress[SlaveFlag];//配置从属地址
    TXByteCtr = 1; //加载TX字节计数器
    While (UCB0CTLW0和UCTXSTP); //确保停止条件已发送
    
    UCB0CTLW0 |= UCTR | UCTXSTT; // I2C TX,启动条件
    
    __bis_sr_register (LPM0_BITS | GIE); //输入带中断的LPM0
    //保留在LPM0中,直到所有数据
    //已发送
    //更改从属地址
    SlaveFlag++;
    如果(SlaveFlag >3) //滚动从属地址
    {
    SlaveFlag =0;
    }
    }
    #if
    
    defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
    #pragma vector = USSCI_B0_vector
    __interrupt void UISR_B0_ISR(void)
    #Elif defined(__GSCI__)
    void __attribute__(interrupt (USCI_B0_vector)
    
    
    #endif
    {
    SWITCH(__EIN_RANGE(UCB0IV, USI_I2C_UCBIT9IFG))
    {
    案例USI_NONE: 中断; //矢量0:无中断
    案例USI_I2C_UCALIFG:中断; //矢量2:ALIFG
    案例USI_I2C_UCNACKIFG: //矢量4:NACKIFG
    UCB0CTLW0 |= UCTXSTT; //如果不确认,请重新发送启动
    中断;
    案例USI_I2C_UCSTIFG:中断; //向量6:STTIFG
    案例USI_I2C_UCSTPIFG:中断; //矢量8:STPIFG
    案例USI_I2C_UCRXIFG3:中断; //矢量10:RXIFG3
    案例USI_I2C_UCTXIFG3:中断; //矢量12:TXIFG3
    案例USI_I2C_UCRXIFG2:中断; //矢量14:RXIFG2
    案例USI_I2C_UCTXIFG2:中断; //矢量16:TXIFG2
    案例USI_I2C_UCRXIFG1:中断; //矢量18:RXIFG1
    案例USI_I2C_UCTXIFG1:中断; //矢量20:TXIFG1
    案例USI_I2C_UCRXIFG0:中断; //矢量22:RXIFG0
    案例USI_I2C_UCTXIFG0: //矢量24:TXIFG0
    IF (TXByteCtr) //检查TX字节计数器
    {
    UCB0TXBUF = TXData[SlaveFlag]; //加载TX缓冲区
    TXByteCtr // Decrement TX字节计数
    器}
    否则
    {
    UCB0CTLW0 |= UCTXSTP; // I2C停止条件
    UCB0IFG &=~UCTXIFG; //清除USI_B0 TX int标志
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0
    }
    中断;
    默认值:break;
    }
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    达尔文
    我能够使用您的代码重新创建您的问题,添加上拉电阻即可解决问题。 请尝试将1.6 和WFP 1.7 与VCC连接起来,并将其拉至4.7K。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的先生:

    请向我们发送您已调试和测试的最终代码。 我们希望在系统中实现i2c接口。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,先生,
    我想了解从msp430fr5969(master)到ssd1306 (从属)的i2c接口的引脚配置。 (要知道,我是否必须连接DC和重置引脚)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    这些引脚是来自msp430fr5969的31 [SDA] y 32 [SCL]。

    我仍在为此努力。 如果您对我的代码有一些建议。 请告诉 我[见上文]。

    此致。

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

    我正在使用6引脚模块(VCC,GND,rst,dc,scl, SDA)。 我是否必须连接所有引脚才能工作此模块,或者4个引脚足够(VCC,GND,sda,scl)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,先生,

    请附上您在本模块中使用的最终代码。  

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

    我已经调试了用户提示代码,但我还没有结束显示模块。 我正在连接已调试的固件。 我尝试了上面提到的针脚。 结果没有得到。 请告知我们编码正确。 (我也使用了外部上拉电阻)。


    下面是我的代码:

    #include <MSP4S.h>

    const unsigned char Init[]={0xAE,0x81,0x07,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA,0xA8,0x3F,
    0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA6,0xA4,0xAF,0xA5};

    Void主(void)

    WDTCTL = WDTPW | WDTHOLD;

    //用于SCL和sda线路
    P1SEL1 || BIT6 + BIT7;
    P1SEL0 &=~(BIT6 | BIT7);

    // GPIO引脚配置
    P1DIR || BIT5; //启用和禁用重置引脚时,默认直流引脚为GND
    P1OUT &=~BIT5;

    //禁用电源打开默认高阻抗状态
    PM5CTL0 &=~LOCKLPM2;

    // i2c模式的配置
    UCB0CTLW0 |= UCSWRST;
    UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC | UCSSEL_2; // I2C主模式
    UCB0CTLW1 = UCASTP_2; //使用SMCLK,保持SW重置
    UCB0BR0=0x40;
    UCB0I2CSA = 0x3C; // SSD1306的从属地址,6针脚模块
    UCB0CTL1 &=~UCSWRST;
    UCB0IE |= UCTXIE;

    同时(1)

    While (UCB0CTL1和UCTXSTP);
    UCB0CTLW0 |= UCTR | UCTXSTT;
    __bis_sr_register (LPM0_BITS | GIE);
    }
    }


    #pragma vector = USI_B0_vector
    __interrupt void USI_B0_ISR(void){
    Switch(__偶 数_in_range(UCB0IV, 0x1E))//USI_I2C_UCBIT9IFG))

    案例USI_NONE: 中断; //矢量0:无中断
    案例USI_I2C_UCALIFG:中断; //矢量2:ALIFG
    案例USI_I2C_UCNACKIFG: //矢量4:NACKIFG
    UCB0CTL1 || UCTXSTT; // I2C启动条件-如果不符合,则重新发送启动
    中断;
    案例USI_I2C_UCSTIFG:
    中断; //引导程序6:开始
    案例USI_I2C_UCSTPIFG:
    中断; //矢量8:检测到停止
    案例USI_I2C_UCRXIFG3:中断; //矢量10:RXIFG3
    案例USI_I2C_UCTXIFG3:中断; //矢量12:TXIFG3
    案例USI_I2C_UCRXIFG2:中断; //矢量14:RXIFG2
    案例USI_I2C_UCTXIFG2:中断; //矢量16:TXIFG2
    案例USI_I2C_UCRXIFG1:中断; //矢量18:RXIFG1
    案例USI_I2C_UCTXIFG1:中断; //矢量20:TXIFG1
    案例USI_I2C_UCRXIFG0:
    中断; //矢量22:RXIFG0主控0
    案例USI_I2C_UCTXIFG0:
    UCB0TXBUF = 0x80; //命令的控制字节配置
    无符号int c;
    对于(c = 0;c < 32;c++)

    P1OUT || BIT5;
    UCB0TXBUF =初始化[c];
    __bis_sr_register (LPM0_bits + GIE);
    }
    //完成dat传输后自动断言停止位
    UCB0CTL1 || UCTXSTP;
    UCB0IFG &=~UCTXIFG;
    中断; //矢量24:TXIFG0主控0
    案例USI_I2C_UCBCNTIFG: //矢量26:BCNTIFG
    中断;
    案例USI_I2C_UCCLTOIFG:中断; //向量28:时钟低超时
    案例USI_I2C_UCBIT9IFG:中断; //矢量30:第9位
    默认值:中断;
    }
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    达尔文

    您是否能够让i2c正常工作?

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

    您好,先生,

    I2C接口工作正常。 现在,我想在此模块中显示任何字符。(SSD1306)。 当我尝试使用普通字符串时,它没有显示。 使用这些命令表是否有不同的方法。  

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

    您如何设置字符串的格式?

    显示屏是否显示任何内容?

    您能否发布i2c交易的屏幕截图?

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

    您好,先生,

    在这里,通过给出下面提到的命令来初始化Display (即,只有DISPLAY处于ON状态)。 但是,我们希望在此显示模块中显示一个字符。 图形库是否支持OLED模块。 此库如何支持OLED显示模块。

    谨随函附上,

    const unsigned char Init[]={0xAE,0x81,0x07,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA,0xA8,0x3F,
    0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA6,0xA4,0xAF,0xA5};//用作命令。 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要为设备编写自己的驱动程序,但driverlib包含所有HAL组件和字体。 您可以通过在此处下载软件来查看另一个示例:

    它是为G2部件编写的,但您可能可以移植它。