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:采用 MSP430G2553的 VEML 6075传感器

Guru**** 2535750 points
Other Parts Discussed in Thread: BQ32000, LM92

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/782984/ccs-msp430g2553-veml-6075-sensor-with-msp430g2553

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

工具/软件:Code Composer Studio

大家好!

             我无法将 I2C 数据写入传感器寄存器。 可能的原因是什么??  我 在此处附加快照。

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

    1.您能否布置 I2C 的波形?
    2.您是否在 SDA 和 SCL?上使用两个上拉电阻器

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

    尊敬的周奕迅:

                    我使用 SparkFun Qwiic UV 传感器板进行连接、因此我希望上拉电阻器已经在这里。  

    我 无法获取 i2c 图。

    我将在此处添加快照。

    代码在绿色突出显示后无法运行 while (!(IFG2&UCBOTXIFG));

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在 UCB0I2CSA 中设置了什么值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将0x10设置为传感器的从地址、并在 View->register options 值中获取0x0010。

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

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

    您好!

    从用户指南中可以看到。 这意味着 salve 在您发送地址后不会发送 ACK。

    您可以借用示波器吗? 或在另一个 MCU 上使用 ADC 来收集电压。

    伊斯天

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

    您好!

         是的、问题仍然存在、这就是从器件为什么不向 MCU 发送 ACK。 尽管我使用的是传感器数据表中提供的正确从器件地址。

       

    此致、

    Ali

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

    您好!

    原因太多。

     主器件(代码是否  正确;波特率是否低于从器件的限制)

    2.通讯网络

      3.从设备

    这就是我坚持查看通信波形的原因。

    否则、您能否使用 MCU 作为从站来检查主站和网络是否正常?

    伊斯天

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

    您好!

          感谢大家的帮助。       

          是的、读取2C 代码的部分时出现问题、但我仍然收到此类型 的陷阱错误、窗口显示 ISR_TRAP_asm。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请检查是否启用了中断(例如 I2C RX ISR)、但不会声明中断函数。
    因此、当中断发生且 MCU 找不到正确的中断函数时、它将跳转到 ISR_TRAP。
    伊斯天
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好!

    感谢您的电子邮件回复和帮助。

    现在我不能卡在 ISR_TRAP 中、但我从读取寄存器中获得固定值、并且传感器值不变。

    我需要正确读取数据字节低电平和数据字节高电平。  

    我在 main 函数()中调用 AS

    Data1 = I2C_USCI_READ_Word (datareg[0]、2);但它始终在表达式寄存器中为我提供255的固定值

    在我的数据和数据1下的代码中、分别是较高和较低的字节。

    I2C 库在下面

    unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data、unsigned char 长度)

    uint16_t Data、Data1、alldata;
    while (UCB0CTL1 & UCTXSTP);       //循环、直到发送 I2C STT
    UCB0CTL1 |= UCTR + UCTXSTT;      // I2C TX、启动条件

    while (!(IFG2&UCB0TXIFG));
    IFG2 &=~UCB0TXIFG;
    if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;  
    UCB0TXBUF = Addr_Data;

    while (!(IFG2&UCB0TXIFG));
    if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;  

    UCB0CTL1 &=~UCTR;  
    UCB0CTL1 |= UCTXSTT;  
    IFG2 &=~UCB0TXIFG;  
    while (UCB0CTL1 & UCTXSTT);

    while (!(IFG2&UCB0RXIFG));
    IFG2 &=~UCB0TXIFG;             //清除 USCI_B0 TX int 标志
    数据= UCB0RXBUF;
    while (!(IFG2&UCB0RXIFG));

    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    Data1 = UCB0RXBUF;

    while (!(IFG2&UCB0RXIFG));
    IFG2 &=~UCB0TXIFG;  
    UCB0CTL1 |= UCTXSTP;

    alldata =数据;
    alldata |=(Data1)<< 8;

    返回所有数据;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    从器件读取数据时的数据。 您始终执行以下操作:IFG2 &=~UCB0TXIFG;
    我想您应该清除 UCB0RXIFG。
    对于该问题、使用示波器将非常有用。
    伊斯天
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    尽管现在我正在获取输出值、但问题仍然存在、在暂停并反复运行后、感应值不 会发生变化。其次、在再次运行和暂停后、会打开一个新窗口、如快照2中所示。

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

    恭喜! 您成功使 I2C 正常工作。
    关于它不更新数据的原因、您需要仔细检查:
    1.您的代码中是否存在任何逻辑错误
    2.您是否遵守通信协议
    3.您是否更改传感器的输入
    新窗口会显示、因为您的代码会运行到其中。 这不是一个错误。

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

    大家好!

    感谢周奕迅的答复。

    我注意到另一个问题。 虽然我可以使用 I2C 正确读取寄存器、但寄存器的读取值是不正确的。  

    void read_worth()

    Data1 = I2C_USCI_READ_Word (datareg[0]、2);

    Data2 = I2C_USCI_READ_Word (datareg[1]、2);

    Data3 = I2C_USCI_READ_Word (datareg[2]、2);


    Data4 = I2C_USCI_READ_Word (datareg[3]、2);

    我只能 正确获取 data1值。其余的 data2、data3和 data4不正确、就像所有值都是255一样。

     请注意、如果我对所有寄存器进行注释(//)并且只读取 data2值、则 data2将提供正确的结果。

    同样,如果我对所有寄存器进行注释并尝试读取 data3值,则 data3将为我提供正确的结果。

    数据4也是如此

    请查看随附的错误寄存器值 data2、data3、data4的快照。

    此致、

    Syed Ali。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    根据您的描述、您的代码显然存在错误。 这就是它的性能不同于您预期的原因。
    您是否可以借用示波器、它可以帮助您了解 MCU 的实际性能。
    伊斯天
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

      实际上现在没有示波器。

     该错误是否与未完全观察 I2C 协议或其他问题有关?

    当我读取寄存器 ID 0x0C 时、我得到快照中指定的确切值、即0x26和0x0C。

    当 我尝试读取0x07、0x09、0x0A、0x0B 等多个读取寄存器时、会出现问题。 我 一次只能读取一个寄存器、得到正确的值。

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    尝试在每个 I2C_USCI_READ_Word ()之间添加一些延迟
    这可能会有所帮助。
    伊斯天
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢周奕迅的回复。 我尝试了一些延迟、但它不起作用。

    我所做的是再次添加从器件地址并再次初始化 I2C。 请查看代码并添加快照。

    但现在的问题是、在暂停并再次运行后、我无法获取 UART 和持续更改的值。 为了做到这一点、我必须再次刻录代码。

     Data1 = I2C_USCI_READ_Word (0x07);

    I2C_USCI_SET_Address (VEML6075_address);


    I2C_USCI_Init (VEML6075_address);

    Data2 = I2C_USCI_READ_Word (0x09);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    为什么需要输入从地址两次?
    I2C_USCI_SET_Address (VEML6075_address);
    I2C_USCI_Init (VEML6075_address);
    您能否发布整个代码? 我可以为您提供帮助。
    伊斯天
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    是否有任何进展。 如果此主题已被解决、请帮助关闭该主题。
    伊斯天
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

       感谢您发送电子邮件。

       实际上、我忙于考试。  

      我也阅读过您之前的电子邮件。 我将向您发送代码、因为问题尚未完全解决。  

      谢谢、

    Ali

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

    您好!

     周奕迅!  当您要求共享代码时,我将在这里发布代码。  

    问题是、现在寄存器中的值发生了变化、我得到了正确的值、但问题是 我为什么需要重新分配从地址并进行初始化?

    包含
    #include
    #include
    #include
    #include
    #include

    #define VEML6075_address 0x10
    #define ACoeff 3.33
    #define BCoef 2.5
    #define CCoef 3.66 //系数
    #define DCoef 2.75
    #define UVAresponsivity 0.001461
    #define UVBresponsivity 0.002591

    uint8_t itime = 50;
    unsigned char data[4];

    uint16_t data1;
    uint16_t data2、data3、data4;
    unsigned char datareg[4]={0x07、0x09、0x0A、0x0B};
    uint16_t UVA=0、uV=0、UVcomp1=0、UVcomp1=0、UVcomp2=0;
    float UVA_calc、UVb_calc、UVI_calc;

    void VEML6075_Init()


    I2C_USCI_Write_Byte (0x00、0x20);


    void main()


    WDTCTL = WDTPW | WDTHOLD;

    while (1)

    I2C_USCI_SET_Address (VEML6075_address);


    I2C_USCI_Init (VEML6075_address);

    VEML6075_Init();

    Data1 = I2C_USCI_READ_Word (0x07);

    I2C_USCI_SET_Address (VEML6075_address);


    I2C_USCI_Init (VEML6075_address);

    Data2 = I2C_USCI_READ_Word (0x09);

    I2C_USCI_SET_Address (VEML6075_address);


    I2C_USCI_Init (VEML6075_address);

    Data3 = I2C_USCI_READ_Word (0x0A);

    I2C_USCI_SET_Address (VEML6075_address);

    I2C_USCI_Init (VEML6075_address);

    Data4 = I2C_USCI_READ_Word (0x0B);


    UVA = data1;
    uVB = data2;
    UVcomp1 = data3;
    UVcomp2 = data4;

    UVA_calc =(UVA -(2.22 * UVcomp1)-(1.33 * UVcomp2));

    uVb_calc =(uVB -(2.95 * UVcomp1)-(1.74 * UVcomp2));

    UVI_calc =((UVA_calc * 0.001461)+(UVB_calc * 0.002591))/ 2;

    Data1 = 0;
    Data2 = 0;
    Data3 = 0;
    Data4 = 0;

    _delay_cycles (3000000);

    以下为 i2c 代码................................................................................................................................

    #include
    I2C_USCI_H
    #define I2C_USCI_H

    #define MPU6050_address 0x68
    #define BQ32000_address 0x68
    #define DS1307_address 0x68
    #define LM92_ADDRESS 0x48

    void I2C_USCI_Init (unsigned char addr);//Khoi tao I2C
    void I2C_USCI_SET_Address (unsigned char addr);//Thai doi Sia chi 从器件
    unsigned char I2C_USCI_READ_Byte (unsigned char 地址);//Doc 1字节
    //Doc nhieu Byte
    unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data);
    //Doc ghi 1字节
    unsigned char I2C_USCI_Write_Byte (unsigned char 地址、unsigned char 数据);
    //ic LM92 co khung Truyen Hoi Khac so VOI Binh thuong NEN phai dung Ham Rieng
    unsigned int read_LM92();

    空 I2C_USCI_Init (无符号字符 addr)

    P1SEL |= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
    P1SEL2|= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
    UCB0CTL1 |= UCSWRST;//启用 SW 复位
    UCB0CTL0 = UCMST+UCMODE_3+UCSYNC;// I2C 主器件、同步模式
    UCB0CTL1 = UCSSEL_2+UCSWRST;//使用 SMCLK、保持软件复位
    UCB0BR0 = 40;// fSCL = SMCLK/40 =~400kHz
    UCB0BR1 = 0;
    UCB0I2CSA = addr;//设置从器件地址
    UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行

    空 I2C_USCI_SET_Address (无符号字符 addr)

    UCB0CTL1 |= UCSWRST;
    UCB0I2CSA = addr;//设置从器件地址
    UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行

    unsigned char I2C_USCI_READ_Byte (unsigned char 地址)

    // uint16_t Data=0,Data1=0,alldata=0;
    while (UCB0CTL1 & UCTXSTP);// Cho tin Hieu I2C STT Duoc GUI di
    UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、START

    while (!(IFG2&UCB0TXIFG));// Cho GUI xong
    UCB0TXBUF =地址;// Dia chi Luu Gia 三秒

    while (!(IFG2&UCB0TXIFG));// Cho GUI xong

    UCB0CTL1 &=~Ω UCTR;// I2C RX
    UCB0CTL1 |= UCTXSTT;// I2C 重新启动
    IFG2 &=~UCB0TXIFG;// XOA co Ngat USCI_B0 TX

    while (UCB0CTL1 & UCTXSTT);// Cho den KHI I2C STT Duoc GUI di
    UCB0CTL1 |= UCTXSTP;// GUI 位停止
    返回 UCB0RXBUF;



    unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data)

    unsigned char i=0;
    uint8_t 数据、Data1;
    uint16_t alldata;
    while (UCB0CTL1 & UCTXSTP);//循环、直到发送 I2C STT
    UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX 模式(UCTR=1)、启动条件

    while (!(IFG2&UCB0TXIFG));
    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;  
    UCB0TXBUF = Addr_Data;  

    while (!(IFG2&UCB0TXIFG));
    if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;  


    UCB0CTL1 &=~UCTR;// I2C RX 模式
    UCB0CTL1 |= UCTXSTT;// I2C 启动条件

    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    while (UCB0CTL1 & UCTXSTT);//循环直到发送 I2C STT
    while (!(IFG2&UCB0RXIFG));
    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    数据= UCB0RXBUF;


    while (!(IFG2&UCB0RXIFG));
    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    Data1 = UCB0RXBUF;

    while (!(IFG2&UCB0RXIFG));
    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    UCB0CTL1 |= UCTXSTP;//第1个 TX 之后的 I2C 停止条件


    alldata =数据;
    alldata |=(Data1)<< 8;


    返回所有数据;

    unsigned char I2C_USCI_Write_Byte (unsigned char 地址、unsigned char 数据)

    while (UCB0CTL1 & UCTXSTP);  


    UCB0CTL1 |= UCTR + UCTXSTT;  



    while (!(IFG2&UCB0TXIFG));// Cho cho 位启动 GUI xong
    if (UCB0STAT 和 UCNACKIFG) return UCB0STAT;//Neu bao loi thothat Khoi ham
    UCB0TXBUF =地址;// GUI dia chi Thanh ghi can ghi


    while (!(IFG2&UCB0TXIFG));  
    if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;  
    UCB0TXBUF = DATA & 0xFF;  

    while (!(IFG2&UCB0TXIFG));  
    if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;  
    UCB0TXBUF = DATA >> 8;

    while (!(IFG2&UCB0TXIFG));  
    if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;  
    UCB0CTL1 |= UCTXSTP;  
    IFG2 &=~UCB0TXIFG;  
    返回0;


    unsigned int read_LM92 ()

    unsigned char a;
    while (UCB0CTL1 & UCTXSTP);//循环、直到发送 I2C STT
    UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件

    while (!(IFG2&UCB0TXIFG));
    UCB0TXBUF = 0x00;// Dia chi Luu Gia 三秒

    while (!(IFG2&UCB0TXIFG));

    UCB0CTL1 &=~Ω UCTR;// I2C RX
    UCB0CTL1 |= UCTXSTT;// I2C 启动条件
    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志

    while (UCB0CTL1 & UCTXSTT);//循环直到发送 I2C STT
    A = UCB0RXBUF;
    while (UCB0CTL1 & UCTXSTT);//循环直到发送 I2C STT
    UCB0CTL1 |= UCTXSTP;//第1个 TX 之后的 I2C 停止条件
    返回((A<<8)|UCB0RXBUF);


    #endif  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    正如我之前所说的、这是一个逻辑问题。
    在 I2C_USCI_READ_Word ()函数中、发送一个字节并将 I2C 设置为读取模式。 然后您读取一个字节。
    2.还可以 但在使用 I2C_USCI_READ_Word ()函数之前、您忘记将 I2C 设置为发送模式。
    3.请在 I2C_USCI_READ_Word ()的开头添加 UCB0CTL1 |= UCTR

    4.非常重要,请尝试编写一个漂亮的代码。

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

    您好!

    感谢周奕迅的电子邮件回复。。   

    根据您的建议,我在开头添加了 UCB0CTL1 |= UCT,

    unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data)

      UCB0CTL1 |= UCTR;

       uint8_t 数据、Data1;

       uint16_t alldata;

       while (UCB0CTL1 & UCTXSTP); ........................................................................

    和 main()函数中

    void main()

      WDTCTL = WDTPW | WDTHOLD;

      I2C_USCI_SET_Address (VEML6075_address);

        I2C_USCI_Init (VEML6075_address);

        VEML6075_Init();

      while (1)

       {

       Data1 = I2C_USCI_READ_Word (0x07);

       Data2 = I2C_USCI_READ_Word (0x09);

       Data3 = I2C_USCI_READ_Word (0x0A);

       Data4 = I2C_USCI_READ_Word (0x0B);..................}

    但我会再次遇到相同的问题。 您可以在快照中看到、只有 data1值是可以的。

    现在 ,如果我在读取 data2之前再次添加从地址,那么我将从255……获得更改为的值

    如您所见...

    此致、

    Ali

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    那么、这段时间的代码与上次时间的代码之间是否有任何差异? 您能自己比较吗?
    由于您没有示波器、所以它无法分辨出 MSP430或从器件的错误位置。 我想您已经证明通信正常。 MCU 只从从器件读取255。 也许从器件需要延迟一段时间来发送下一个字。
    3.您已经意识到该函数和添加一些代码只会增加一些延迟,我认为延迟时间是可以接受的。
    伊斯天