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.

[参考译文] MSP430F6779A:读取 RTC 数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1224885/msp430f6779a-reading-rtc-data

器件型号:MSP430F6779A
主题中讨论的其他器件: BQ32002

大家好、

祝你一切顺利! 我正在使用定制板上的 MSP430F6779A。 我需要从微控制器(使用 I2C)读取 RTC 时间并将其传输到 UART、以检查时间数据是否正常工作。 我使用外部 RTC、即 BQ32002。

我已成功写读。 但我在阅读时遇到问题。

问题是、我将时间设置为85、88、35、1、49、 18, 35;// 31/12/2023 23:58:55

1)我需要秒数据0-59,但我得到1-59。

2)当时间从一小时到下一小时,我没有得到(小时,日,日期,月,年)数据。 我只能得到秒和分钟,但我需要每秒钟得到所有的数据。

请告诉我如何解决该问题、以及我会做出哪些更改。

提前感谢。

此致、

Priyadharshini M.

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

    您好,Priyadharshini M

    我需要从微控制器(使用 I2C)读取 RTC 时间并将其传输到 UART、以检查时间数据是否正常工作

    我是否可以确认在 MSP430F6779A 和 BQ32002之间的 I2C 通信上 MSP430F6779A 是否为 I2C 主机而 BQ32002是否为 I2C 从器件?

    如果 MSP430F6779A 是 I2C 主机、请检查示例代码 https://www.ti.com/lit/zip/slac648上的 msp430f677xA_USCI_i2c_standard_master.c 和 msp430f677xA_uscib0_i2c_06、07、10、11.c

    谢谢!

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

    尊敬的 Xiaodong LI:

    感谢您的答复。

    我已经在使用  msp430f677xA_USCI_i2c_standard_master.c

    我的代码是、

    //MSP430F677xA 演示- USCI_B0、I2C 主器件多字节 TX/RX
    //
    //说明:I2C 主器件与 I2C 从器件的发送和接收通信
    // 3个不同长度的不同消息。 I2C 主器件将进入 LPM0模式
    //同时通过 I2C 中断等待消息的发送/接收。
    // ACLK = NA、MCLK = SMCLK = DCO 16MHz。
    //
    ///|\/|\
    // MSP430F6779A 4.7K |
    //------------------------------------------------------- | 4.7K
    ///|\| P2.5|--++--|- I2C 时钟(UCB.S.)
    //|||||
    //--> RST P2.6|-------- +/- I2C 数据(UCB0SDA)
    //||
    //||
    //||
    //||
    //||
    //||
    //
    // Nima Eskandari 和 Ryan Meredith
    // Texas Instruments Inc.
    // 2018年1月
    //通过 CCS v7.3构建
    //*****

    #include
    #include
    #include

    //*****
    // Pin Config Config (引脚配置
    //*****

    #define LED_OUT P1OUT
    #define LED_DIR P1DIR
    #define LED_PIN BIT0

    //*****
    //命令示例
    //*****

    //#define SLAVE_ADDR 0x48
    #define SLAVE_ADDR 0x68
    //#define SLAVE_ADDR 0xD0

    /* CMD_TYPE_X_SLAVE 是主设备发送到从设备的示例命令。
    *从器件将发送示例 SlaveTypeX 缓冲区作为响应。
    *
    * CMD_TYPE_X_MASTER 是主设备向从设备发送的示例命令。
    *从器件将初始化自身以接收 MasterTypeX 示例缓冲区。
    **/

    #define CMD_TYPE_0_SLAVE 0
    #define CMD_TYPE_1_SLAVE 1.
    #define CMD_TYPE_2_SLAVE 2.

    #define CMD_TYPE_0_MASTER 0

    #define TYPE_0_LENGTH 7.

    #define MAX_BUFFER_SIZE 20.

    /* MasterTypeX 是在主器件中初始化的示例缓冲区
    *主器件发送到从器件。
    * SlaveTypeX 是在从器件中初始化的示例缓冲区,它们将是
    *由从机发送到主机。
    **/
    uint8_t MasterType0 [TYPE_0_LENGTH]={85、88、35、1、49、 18、35};//{28/04/2023 01:57:01 pm}
    uint8_t SlaveType0 [TYPE_0_LENGTH]={0};

    //*****
    //常规 I2C 状态机
    //*****

    typedef 枚举 I2C_ModeEnum{
    IDLE_MODE、
    NACK_MODE、
    TX_REG_ADDRESS_MODE、
    RX_REG_ADDRESS_MODE、
    TX_DATA_MODE、
    RX_DATA_MODE、
    SWITCH_TO_RX_MODE、
    SWITHC_TO_TX_MODE、
    TIMEOUT_MODE
    } I2C_Mode;

    /*用于跟踪软件状态机的状态*/
    I2C_Mode MasterMode = IDLE_MODE;

    /*要使用的寄存器地址/命令*/
    uint8_t TransmitRegAddr = 0;

    /* ReceiveBuffer:用于在 ISR 中接收数据的缓冲区
    * RXByteCtr:要接收的剩余字节数
    ReceiveIndex:要在 ReceiveBuffer 中接收的下一个字节的索引
    * TransmitBuffer :用于在 ISR 中传输数据的缓冲区
    * TXByteCtr:待传输的剩余字节数
    * TransmitIndex:在 TransmitBuffer 中发送的下一个字节的索引
    **/
    uint8_t ReceiveBuffer[MAX_BUFFER_SIZE]={0};
    uint8_t RXByteCtr = 0;
    uint8_t ReceiveIndex = 0;
    uint8_t TransmitBuffer[MAX_BUFFER_SIZE]={0};
    uint8_t TXByteCtr = 0;
    uint8_t TransmitIndex = 0;

    /* I2C 写入和读取函数*/

    /*对于具有 dev_addr 的从器件、写入在* reg_data 中指定的数据
    *
    * dev_addr:从设备地址。
    *例子: SLAVE_ADDR
    * reg_addr :发送到从机的寄存器或命令。
    *示例: CMD_TYPE_0_MASTER
    ** reg_data :要写入的缓冲区
    *示例: MasterType0
    * count :* reg_data 的长度
    *示例: TYPE_0_LENGTH
    *
    **/

    void CopyArray (uint8_t *源、uint8_t * dest、uint8_t count)

    uint8_t copyIndex = 0;
    对于(copyIndex = 0;copyIndex < count;copyIndex ++)

    dest[copyIndex]= source[copyIndex];
    }
    }

    //I2C_Mode I2C_Master_WriteReg (uint8_t dev_addr、uint8_t reg_addr、uint8_t * reg_data、uint8_t count);

    /*对于具有 dev_addr 的从器件、读取在从器件 reg_addr 中指定的数据。
    *接收到的数据在 ReceiveBuffer 中可用
    *
    * dev_addr:从设备地址。
    *例子: SLAVE_ADDR
    * reg_addr :发送到从机的寄存器或命令。
    *示例: CMD_TYPE_0_SLAVE
    *计数:要读取的数据长度
    *示例: TYPE_0_LENGTH
    **/
    I2C_Mode I2C_Master_ReadReg (uint8_t dev_addr、uint8_t reg_addr、uint8_t count);
    void CopyArray (uint8_t *源、uint8_t * dest、uint8_t count);

    I2C_Mode I2C_Master_ReadReg (uint8_t dev_addr、uint8_t reg_addr、uint8_t count)

    /*初始化状态机*/
    MasterMode = TX_REG_ADDRESS_MODE;
    TransmitRegAddr = reg_addr;
    RXByteCtr = count;
    TXByteCtr = 0;
    ReceiveIndex = 0;
    TransmitIndex = 0;

    ///*初始化从地址和中断*/
    // UCB0I2CSA = dev_addr;
    // UCB0IFG &&~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
    // UCB0IE &&~UCRXIE;//禁用 RX 中断
    // UCB0IE |= UCTXIE;//启用 TX 中断
    //
    // UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
    //_ bis_SR_register (LPM0_bits + GIE);//进入 LPM0并具有中断

    /*初始化从机地址和中断*/
    UCB1I2CSA = DEV_addr;
    UCB1IFG &&~(UCTXIFG + UCRXIFG);//清除所有挂起的中断
    // UCB1IE |= UCRXIE;//启用 RX 中断
    // UCB1IE &&~UCTXIE;//启用 TX 中断
    UCB1IE &&~UCRXIE;//禁用 RX 中断
    UCB1IE |= UCTXIE;//启用 TX 中断

    UCB1CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
    _ bis_SR_register (GIE);//随着中断进入 LPM0
    返回 MasterMode;

    }


    I2C_Mode I2C_Master_WriteReg (uint8_t dev_addr、uint8_t reg_addr、uint8_t * reg_data、uint8_t count)

    /*初始化状态机*/
    MasterMode = TX_REG_ADDRESS_MODE;
    TransmitRegAddr = reg_addr;

    //将寄存器数据复制到 TransmitBuffer
    CopyArray (reg_data、TransmitBuffer、count);

    TXByteCtr = count;
    RXByteCtr = 0;
    ReceiveIndex = 0;
    TransmitIndex = 0;

    ///*初始化从地址和中断*/
    // UCB0I2CSA = dev_addr;
    // UCB0IFG &&~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
    // UCB0IE &&~UCRXIE;//禁用 RX 中断
    // UCB0IE |= UCTXIE;//启用 TX 中断
    //
    // UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
    //_ bis_SR_register (LPM0_bits + GIE);//进入 LPM0并具有中断

    /*初始化从机地址和中断*/
    UCB1I2CSA = DEV_addr;
    UCB1IFG &&~(UCTXIFG + UCRXIFG);//清除所有挂起的中断
    // UCB1IE |= UCRXIE;//禁用 RX 中断
    // UCB1IE &&~UCTXIE;//启用 TX 中断
    UCB1IE &&~UCRXIE;//禁用 RX 中断
    UCB1IE |= UCTXIE;//启用 TX 中断


    UCB1CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
    _ bis_SR_register (GIE);//随着中断进入 LPM0

    // UCB1TXBUF = reg_addr;
    // UCB1TXBUF = REG_DATA;
    返回 MasterMode;
    }

    /*void CopyArray (uint8_t *source、uint8_t *dest、uint8_t count)

    uint8_t copyIndex = 0;
    对于(copyIndex = 0;copyIndex < count;copyIndex ++)

    dest[copyIndex]= source[copyIndex];
    }
    }*/

    //*****
    //设备初始化
    //*****

    void initClockTo16MHz()

    UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
    UCSCTL4 |= SELA _2;//设置 ACLK = REFO
    _ bis_SR_register (SCG0);//禁用 FLL 控制环路
    UCSCTL0 = 0x0000;//设置尽可能低的 DCOx、MODx
    UCSCTL1=DCORSEL_5;//选择 DCO 范围16MHz 运行
    UCSCTL2 = FLLD_0 + 487;//将 DCO 乘法器设置为16MHz
    //(N + 1)* FLLRef = Fdco
    //(487 + 1)* 32768 = 16MHz
    //设置 FLL Div = fDCOCLK
    __ BIC_SR_register (SCG0);//启用 FLL 控制环路

    //当 DCO 范围位已存在时 DCO 最坏情况下的稳定时间
    //更改了 n x 32 x 32 x f_MCLK / f_FLL_reference。 请见5xx 中的 UCS 章节
    //针对优化进行 UG。
    // 32 x 32 x 16 MHz / 32、768Hz = 500000 = DCO 的 MCLK 周期达到稳定
    __delay_cycles (500000);//
    //循环直到 XT1、XT2和 DCO 故障标志被清除
    操作

    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DCO 故障标志
    SFRIFG1并且=~OFIFG;//清除故障标志
    —while (SFRIFG1&OFIFG);//测试振荡器的故障标志
    }

    uint16_t setVCoreUp (uint8_t 电平)

    uint32_t PMMRIE_BACKUP、SVSMHCTL_BACKUP、SVSMLCTL_BACKUP;

    //增大 Vcore 的代码流程已更改,可以解决此问题
    //此勘误表 FLASH37。
    //请参阅勘误表以了解特定的器件是否受到影响
    //请勿更改此函数

    //打开 PMM 寄存器以进行写入访问
    PMMCTL0_H = 0xA5;

    //禁用专用中断
    //备份所有寄存器
    PMMRIE_BACKUP = PMMRIE;
    PMMRIE &=~(SVMHVLRPE | SVSHPE | SVMLVLRPE |
    SVSLPE | SVMHVLRIE | SVMHIE |
    SVSMHDLYIE | SVMLVLRIE | SVMLIE |
    SVSMLDLYIE
    );
    SVSMHCTL_BACKUP = SVSMHCTL;
    SVSMLCTL_BACKUP = SVSMLCTL;

    //清除标志
    PMMIFG = 0;

    //将 SVM 高侧设置为新的电平,并检查 VCORE 是否可以升高
    SVSMHCTL = SVMHE | SVSHE |(SVSMHRRL0 *电平);

    //等待 SVM 高侧稳定
    while ((PMMIFG 和 SVSMHDLYIFG)== 0)


    }

    //清除标志
    PMMIFG &=~μ V SVSMHDLYIFG;

    //检查 VCORE 是否可以增大
    if (((PMMIFG & SVMHIFG)== SVMHIFG)

    //-> Vcc 太低、导致 Vcore 增大
    //恢复之前的设置
    PMMIFG &=~μ V SVSMHDLYIFG;
    SVSMHCTL = SVSMHCTL_BACKUP;

    //等待 SVM 高侧稳定
    while ((PMMIFG 和 SVSMHDLYIFG)== 0)


    }

    //清除所有标志
    PMMIFG &=~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
    SVMLVLRIFG | SVMLIFG |
    SVSMLDLYIFG
    );

    //恢复 PMM 中断使能寄存器
    PMMRIE = PMMRIE_BACKUP;
    //针对写入访问锁定 PMM 寄存器
    PMMCTL0_H = 0x00;
    //返回:电压未设置
    返回 false;
    }

    //还将 SVS 高侧设置为新的电平
    //Vcc 足以使 Vcore 增加
    SVSMHCTL |=(SVSHRVL0 *电平);

    //等待 SVM 高侧稳定
    while ((PMMIFG 和 SVSMHDLYIFG)== 0)


    }

    //清除标志
    PMMIFG &=~μ V SVSMHDLYIFG;

    //将 VCORE 设置为新的水平
    PMMCTL0_L = PMMCOREV0 *电平;

    //将 SVM、SVS 低电平设置到新的电平
    SVSMLCTL = SVMLE |(SVSMLRRL0 *电平)|
    SVSLE |(SVSLRVL0 *等级);

    //等待直到 SVM、SVS 低电平侧稳定
    while ((PMMIFG 和 SVSMLDLYIFG)== 0)


    }

    //清除标志
    PMMIFG &=~μ V SVSMLDLYIFG;
    // SVS、SVM 内核和高侧现在设置为针对新的内核级别进行保护

    //恢复低侧设置
    //清除所有其他位_except_级别设置
    SVSMLCTL &=(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 +)
    SVSMLRRL1 + SVSMLRRL2
    );

    //清除备份寄存器中的电平设置,保留所有其它位
    SVSMLCTL_BACKUP &=
    ~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);

    //恢复低侧 SVS 监视器设置
    SVSMLCTL |= SVSMLCTL_BACKUP;

    //恢复高侧设置
    //清除除电平设置之外的所有其它位
    SVSMHCTL &=(SVSHRVL0 + SVSHRVL1 +
    SVSMHRRL0 + SVSMHRRL1 +
    SVSMHRRL2
    );

    //清除备份寄存器中的电平设置,保留所有其它位
    SVSMHCTL_BACKUP &=
    ~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);

    //恢复备份
    SVSMHCTL |= SVSMHCTL_BACKUP;

    //等待高侧,低侧稳定
    while (((PMMIFG & SVSMLDLYIFG)== 0)&&
    ((PMMIFG 和 SVSMHDLYIFG)=0))


    }

    //清除所有标志
    PMMIFG &=~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
    SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG
    );

    //恢复 PMM 中断使能寄存器
    PMMRIE = PMMRIE_BACKUP;

    //针对写入访问锁定 PMM 寄存器
    PMMCTL0_H = 0x00;

    返回 true;
    }

    bool increaseVCoreToLevel2()

    uint8_t level = 2;
    uint8_t actlevel;
    BOOL STATUS = true;

    //设置掩码的最大值 协商
    电平&= PMMCOREV_3;

    //获取实际的 VCORE
    actlevel = PMMCTL0 & PMMCOREV_3;

    //逐步增加或减少
    while ((level!= actlevel)&&(status == true))

    if (level > actlevel)

    状态= setVCoreUp (++actlevel);
    }
    }

    返回(状态);
    }

    void initGPIO()

    // LED
    LED_OUT &&~LED_PIN;// P1用于 LED 和 RESET 输出的设置
    LED_DIR |= LED_PIN;

    //I2C 引脚
    // P2SEL0 |= BIT5 | BIT6;//将 P2.5、P2.6设置为 UCB.S.、UCB0SDA
    //I2C 引脚
    P4SEL0 |= BIT4 | BIT5;//将 P4.4、P4.5设置为 UCB.S.、UCB1SDA
    }

    void initI2C()

    UCB1CTLW0 |= UCSWRST;//启用软件复位
    UCB1CTLW0 |= UCMST | UCMODE_3 | UCSYNC | UCSSEL_2;// I2C 主器件,使用 SMCLK

    UCB1BRW_L = 160;// fSCL = SMCLK/160 =~100kHz
    UCB1BRW_H = 0;
    UCB1I2CSA = SLAVE_ADDR;//从器件地址为048h
    UCB1CTLW0 &&~UCSWRST;//清除软件复位,恢复操作
    UCB1IE |= UCNACKIE;
    }

    void eUSCI_A0_UART_115200 ()//FPGA uart

    //引脚初始化
    P3SEL0 |=(BIT0 | BIT1);// P3.0 = UCA0RX、P3.1 = UCA0TX
    P3DIR |=(BIT0 | BIT1);

    //波特率设置115200bps
    UCA0CTLW0 |= UCSWRST;//**将状态机置于复位状态**
    UCA0CTLW0 |= UCSSEL_SMCLK;//设置 SMCLK
    UCA0BRW = 8;// 16MHz / 115200 -- UCBRx = 8
    UCA0MCTLW = 0xF7A1;//调制 UCBRSx = 0xF7、UCBRFx = 10、UCOS16 = 1
    UCA0CTLW0 &=~0x0001;//初始化 UART
    // UCA0IE = 0x0000;
    // UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断
    }
    void send (uint8_t *c、int 通道)

    while (* c!= 0)

    if (信道=0)

    UCA0TXBUF =* c++;
    while (!(UCA0IFG 和 UCTXCPTIFG));
    UCA0IFG &=~UCTXCPTIFG;
    }
    }
    }

    //*****
    //主要文件
    //发送和接收三条包含示例命令的消息*****
    //*****

    int main (void){

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    增加 VCoreToLevel2();
    initClockTo16MHz();
    initGPIO();
    initI2C();

    // I2C_Master_WriteReg (0x68、0x00、0x95、1);
    // I2C_Master_WriteReg (0xD0、0x00、0x95、1);
    // I2C_Master_ReadReg (0xD0、0、1);
    // I2C_Master_WriteReg (0x68、0x00、95、2);
    /* I2C_Master_WriteReg (SLAVE_ADDR、CMD_TYPE_0_MASTER、MasterType0、TYPE_0_LENGTH);
    __delay_cycles (50000);//
    while (1){
    I2C_Master_ReadReg (SLAVE_ADDR、CMD_TYPE_0_SLAVE、TYPE_0_LENGTH);
    // I2C_Master_ReadReg (SLAVE_ADDR、0x00、1);
    CopyArray (ReceiveBuffer、SlaveType0、TYPE_0_LENGTH);
    __delay_cycles (50000);
    }*/
    // I2C_Master_WriteReg (SLAVE_ADDR、CMD_TYPE_0_MASTER、MasterType0、TYPE_0_LENGTH);
    // I2C_Master_WriteReg (SLAVE_ADDR、CMD_TYPE_1_MASTER、MasterType1、TYPE_1_LENGTH);
    // I2C_Master_WriteReg (SLAVE_ADDR、CMD_TYPE_2_MASTER、MasterType2、TYPE_2_LENGTH);
    //
    // I2C_Master_ReadReg (SLAVE_ADDR、CMD_TYPE_0_SLAVE、TYPE_0_LENGTH);
    // CopyArray (ReceiveBuffer、SlaveType0、TYPE_0_LENGTH);
    //
    // I2C_Master_ReadReg (SLAVE_ADDR、CMD_TYPE_1_SLAVE、TYPE_1_LENGTH);
    // CopyArray (ReceiveBuffer、SlaveType1、TYPE_1_LENGTH);
    //
    // I2C_Master_ReadReg (SLAVE_ADDR、CMD_TYPE_2_SLAVE、TYPE_2_LENGTH);
    // CopyArray (ReceiveBuffer、SlaveType2、TYPE_2_LENGTH);
    /* eUSCI_A0_UART_115200 ();*/
    // send ("FLDEC\n",0);
    I2C_Master_WriteReg (SLAVE_ADDR、CMD_TYPE_0_MASTER、MasterType0、TYPE_0_LENGTH);
    //_delay_cycles (50000);
    // send (ReceiveBuffer,0);
    while (1)

    I2C_Master_ReadReg (SLAVE_ADDR、CMD_TYPE_0_SLAVE、TYPE_0_LENGTH);
    CopyArray (ReceiveBuffer、SlaveType0、TYPE_0_LENGTH);

    __delay_cycles (4000000);
    发送(ReceiveBuffer、0);
    __delay_cycles (4000000);
    // send ("FLDEC\n",0);
    }

    //__ bis_SR_register (GIE);
    //返回0;
    }

    //*****
    // I2C 中断
    //*****

    #if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
    #pragma vector = USCI_B1_VECTOR
    __interrupt void USCI_B1_ISR (void)
    #Elif 已定义(_ GNU _)
    void __attribute_((interrupt (USCI_B1_vector))) USCI_B1_ISR (void)
    #else
    #错误编译器不受支持!
    #endif

    //必须从 UCB0RXBUF 读取
    uint8_t rx_val = 0;
    switch (__even_in_range (UCB1IV、USCI_I2C_UCBIT9IFG))

    USCI_NONE:break;// Vector 0:无中断
    情况 USCI_I2C_UCALIFG:break;//向量2:ALIFG
    实例 USCI_I2C_UCNACKIFG://矢量4:NACKIFG
    中断;
    情况 USCI_I2C_UCSTTIFG:break;// Vector 6:STTIFG
    情况 USCI_I2C_UCSTPIFG:break;// Vector 8:STPIFG
    情况 USCI_I2C_UCRXIFG3:break;// Vector 10:RXIFG3
    情况 USCI_I2C_UCTXIFG3:break;// Vector 12:TXIFG3
    情况 USCI_I2C_UCRXIFG2:break;// Vector 14:RXIFG2
    情况 USCI_I2C_UCTXIFG2:break;// Vector 16:TXIFG2
    情况 USCI_I2C_UCRXIFG1:break;// Vector 18:RXIFG1
    USCI_I2C_UCTXIFG1:break;// Vector 20:TXIFG1
    实例 USCI_I2C_UCRXIFG0://矢量22:RXIFG0
    RX_val = UCB1RXBUF;
    IF (RXByteCtr)

    ReceiveBuffer[ReceiveIndex++]= Rx_val;
    RXByteCtr --;
    }
    if (RXByteCtr =1)

    UCB1CTLW0 |= UCTXSTP;
    }
    否则、如果(RXByteCtr =0)

    UCB1IE &=~UCRXIE;
    MasterMode = IDLE_MODE;
    __ BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
    }
    中断;
    case USCI_I2C_UCTXIFG0://矢量24:TXIFG0
    开关(主模式)

    案例 TX_REG_ADDRESS_MODE:
    UCB1TXBUF = TransmitRegAddr;
    IF (RXByteCtr)
    MasterMode = SWITCH_TO_RX_MODE;//需要立即开始接收
    方案
    MasterMode = TX_DATA_MODE;//继续传输发送缓冲器中的数据
    中断;

    案例 SWITCH_TO_RX_MODE:
    UCB1IE |= UCRXIE;//启用 RX 中断
    UCB1IE &&~UCTXIE;//禁用 TX 中断
    UCB1CTLW0 &&~μ W UCTR;//切换到接收器
    MasterMode = RX_DATA_MODE;//状态状态为接收数据
    UCB1CTLW0 |= UCTXSTT;//发送重复启动
    if (RXByteCtr =1)

    //因为这是 N-1个字节,所以必须发送 STOP
    while ((UCB1CTLW0和 UCTXSTT));
    UCB1CTLW0 |= UCTXSTP;//发送停止条件
    }
    中断;

    案例 TX_DATA_MODE:
    IF (TXByteCtr)

    UCB1TXBUF = TransmitBuffer[TransmitIndex++];
    TXByteCtr—;
    }
    方案

    //完成传输
    UCB1CTLW0 |= UCTXSTP;//发送停止条件
    MasterMode = IDLE_MODE;
    UCB1IE &&~UCTXIE;//禁用 TX 中断
    __ BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
    }
    中断;

    默认值:
    ___ no_operation();
    中断;
    }
    中断;
    默认值:中断;
    }
    }

    1)我需要秒数据0-59,但我得到1-59。

    2)当时间从一小时到下一小时,我没有得到(小时,日,日期,月,年)数据。 我只能得到秒和分钟,但我需要每秒钟得到所有的数据。

    请告诉我如何解决该问题、以及我会做出哪些更改。

    谢谢。  

    Priyadharshini  

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

    1)你的 send()函数需要一个字符串,但你没有给出它。 这条线

    while (*c!= 0)
    将在秒=0时停止发送。

    我建议您重新设计 send()函数,以使用长度而不是字符串。 (你也可以使用像 snprintf()这样的函数,但该函数对于 BCD 数有点不灵活。

    2)我怀疑这些行:

    while (!(UCA0IFG & UCTXCPTIFG));
    > UCA0IFG &=~UCTXCPTIFG;

    没有按预期工作、因为 TXCPTIFG 是一个相当间接的指标。 我建议将这些(两者)替换为:

    > while (!(UCA0IFG & UCTXIFG)); //等待 TXBUF 清零

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

    Bruce、您好!

      解决了我的问题。 感谢你的帮助。