主题中讨论的其他器件:MSP430F5529、 MSP430FR5969
大家好、下面是我的节目
我正在尝试将用于 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
}