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.

[参考译文] MSP-EXP430F5529LP:使用 F5529LP 代替 F5969作为 I2C 主设备

Guru**** 2586275 points
Other Parts Discussed in Thread: MSP430FR5969, MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1183918/msp-exp430f5529lp-use-f5529lp-instead-of-f5969-as-i2c-master

器件型号:MSP-EXP430F5529LP
主题中讨论的其他器件:MSP430F5529MSP430FR5969

大家好、下面是我的节目

我正在尝试将用于 F5969的 I2C 主程序修改为用于 F5529、但第28行、第34行和第89行中有关 I2C 设置的部分保持报告未定义您能否为我指出或修复问题

谢谢和粗鲁

#include <msp430.h> 
#include <stdio.h>
#include <stdint.h>

volatile uint8_t TxCount, Control_Byte, i;
volatile uint8_t *PTxData;   // Pointer to TX data
volatile uint8_t TxData[3], Msg1[]={1,2,3}, Msg2[]={4,5,6};

void main(void) {

    WDTCTL = WDTPW | WDTHOLD;   //Stop watchdog timer

    PM5CTL0 &= ~LOCKLPM5; //Unlocks GPIO pins at power-up
    P1DIR |= BIT0 + BIT2 + BIT3 + BIT4 + BIT5 ;
    P3DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;

    P4SEL |= 0xFF; //Setup I2C
    P1OUT = BIT1; // Pull-up resistor on P1.1
    P1REN = BIT1; // Select pull-up mode for P1.1
    P1IES = BIT1; // P1.1 Hi/Lo edge
    P1IFG = 0;    // Clear all interrupt flags
    P1IE = BIT1;  // P1.1 interrupt enabled

    P4OUT &= ~BIT7; //green LED off
    P1OUT &= ~BIT0; //red LED off

    // Configure the eUSCI_B0 module for I2C at 100 kHz
    UCB1CTLW0 |= UCSWRST;
    UCB1CTLW0 |=  UCSSEL__SMCLK + UCMST + UCTR + UCSYNC + UCMODE_3; //Select SMCLK, master, transmitter, synchronous, I2C
    UCB1BRW = 10;  //Divide SMCLK by 10 to get ~100 kHz
    UCB1I2CSA = 0x77; // FR2355 address
    UCB1CTLW1 &= ~UCSWRST; // Clear reset

    UCB1IE |= UCTXIE11; //Enable I2C transmission interrupt
    __enable_interrupt(); //Enable global interrupts.
    Control_Byte=0x01;

    while(1)
    {
        LPM4;       //Wait for pushbutton interrupt in low power mode
        Control_Byte ^= BIT0; //Toggle control byte
        if(Control_Byte == 0x01)
        {
            for(i=0;i<3;i++)TxData[i]=Msg1[i];
            P1OUT |= BIT0; //Red LED
        }
        else
        {
            for(i=0;i<3;i++)TxData[i]=Msg2[i];
            P4OUT |= BIT7; //Green LED on
        }
        PTxData = (uint8_t *)TxData; //Set pointer to start of TX array
        TxCount = 3; //Send bytes to slave
        UCB1CTLW1 |= UCTXSTT; // Set to transmit and start
        LPM0;    // Remain in LPM0 until all data transmitted
        while (UCB1CTLW1 & UCTXSTP);  // Ensure stop condition got sent
        __delay_cycles(10000);
        P1OUT &= ~BIT0; //LEDs off
        P4OUT &= ~BIT7;
    }
}

#pragma vector = USCI_B1_VECTOR
__interrupt void USCI_B1_ISR(void)
{
    switch(__even_in_range(UCB0IV,30))
    {
        case 0: break;         // Vector 0: No interrupts
        case 2: break;         // Vector 2: ALIFG
        case 4: break;         // Vector 4: NACKIFG
        case 6: break;         // Vector 6: STTIFG
        case 8: break;        // Vector 8: STPIFG
        case 10: break;         // Vector 10: RXIFG3
        case 12: break;         // Vector 12: TXIFG3
        case 14: break;         // Vector 14: RXIFG2
        case 16: break;         // Vector 16: TXIFG2
        case 18: break;         // Vector 18: RXIFG1
        case 20: break;         // Vector 20: TXIFG1
        case 22: break;         // Vector 22: RXIFG0
        case 24:                // Vector 24: TXIFG0
                        if (TxCount)      // Check if TX byte counter not empty
                            {
                                UCB1TXBUF = *PTxData++; // Load TX buffer
                                TxCount--;            // Decrement TX byte counter
                            }
                        else
                            {
                                UCB1CTL1 |= UCTXSTP; // I2C stop condition
                                UCB1IFG &= ~UCTXIFG1;  // Clear USCI_B0 TX int flag
                                LPM0_EXIT;      // Exit LPM0
                            }
                        break;
        case 26: break;        // Vector 26: BCNTIFG
        case 28: break;         // Vector 28: clock low timeout
        case 30: break;         // Vector 30: 9th bit
        default: break;
    }
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  P1IFG &= ~BIT1;  // Clear P1.1 IFG
  LPM4_EXIT;     // Exit LPM4
}

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

    Jiu Ji、您好!

    我假设您是指 MSP430FR5969

    您可能需要在修复这些问题后进行其他修改、我建议您在 资源浏览器 https://dev.ti.com/tirex/explore/node?node=A__AAgA6nQUp0MrAIFqRqRUrA__msp430ware__IOGqZri__LATEST 中查看 MSP430F5529的 USCI_I2C_standard_master.c 示例

    对于第28行、更改

    UCB1CTLW0 |= UCSWRST;

    UCB1CTL1 |= UCSWRST;  

    USCI I2C 控制寄存器在 MSP430F5529中以这种方式命名。

    对于第34行、UCTXIE11是否应为 UCTXIE1? 通过查看 MSP430FR5969的寄存器映射 、可以看到 UCTXIE11不可用。 您稍后还将清除 UCTXIE1。 不过、您需要切换到仅将 UCTXIE 与 MSP430F5529配合使用、因为 MSP430F5529使用的是 USCI 而不是 eUSCI。  

    对于 第89行、它与上述相同、请改用 UCTXIE。  

    此致、
    Brandon Fisher