大家好,
我是MSP430的初学者,遇到一些问题想麻烦大家指导我。
主要是想调试SPI串口的功能,测试情境如下:
我用lanchpad的MSP430G2553作为Master,用MSP-EXP430F5529作为Slave,
Master将资料从0x00每次递增加1、透过SPI传送给Slave,Slave接收再使用UART将资料传送PC,借此观察结果的正确性。
不过我用Access看回传值一直是错的(不是递增数值),调试很久找不出问题所在,所以上来跟各位高手讨教,请大家指导我一下。
以下是我的程序 :
//Master
#include <msp430.h>
/*
* main.c
*/
int main(void) {
unsigned int data=0x00;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1OUT = 0x00; // P1 setup for reset output
P1DIR |= BIT5;
// Set DCO Clock
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
// SPI Initialize
P1SEL = BIT1 + BIT2 + BIT4;
P1SEL2 = BIT1 + BIT2 + BIT4;
UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 |= 0x02; // /2
UCA0BR1 = 0; //
UCA0MCTL = 0; // No modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
// Reset SPI Slave
P1OUT &= ~BIT5; // Now with SPI signals initialized,
P1OUT |= BIT5; // reset slave
__delay_cycles(100);
// Wait for slave to initialize
// Data Transmit
for(;;)
{
while (!(IFG2 & UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = data;
data++;
__delay_cycles(1000);
}
}
———————————————————————————————————————————————————–
// Slave
#include <msp430.h>
/*
* main.c
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
// CLK Set
UCSCTL3 |= SELREF_2; // Set DCO FLL Reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL Control Loop
UCSCTL0 = 0x0000; // Will be Set Automatically by FLL
UCSCTL1 = DCORSEL_2; // 1 MHz range
UCSCTL2 = FLLD_1 + 32; // Set FLL to approximately 1 MHz:
// FLL divider result = 32768
// 32 * 32768 = "1 MHz"
// SPI Initialize
P3SEL = BIT0|BIT1|BIT2; // Set Pin Function for SPI Mode
UCB0CTL1 |= UCSWRST; // Put State Machine in Reset
UCB0CTL0 |= UCSYNC+UCMSB+UCCKPH; // 3-pin, 8-bit SPI Master,MSB First,Mode 0(UCCKPL=0,UCCKPH=1)
UCB0CTL1 &= ~UCSWRST; // SPI
UCB0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
// UART Initialize
P4SEL |= BIT4+BIT5; // P3.3,4 = USCI_A0 TXD/RXD
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 = 6; // 1MHz 9600 (see User's Guide)
UCA1BR1 = 0; // 1MHz 9600
UCA1MCTL = UCBRS_0 + UCBRF_13+UCOS16; // Modln UCBRSx=0, UCBRFx=0,
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
__bis_SR_register(LPM0_bits + GIE); // CPU off, enable interrupts
return 0;
}
#pragma vector=USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
while (!(UCA1IFG & UCTXIFG)); // USCI_A1 TX buffer ready?
UCA1TXBUF = UCB0RXBUF;
}
Lina Lian:
Ray Hsu,
建议调试程序时,逐步增加程序。你可以先调试程序,首先保证MSP430G2553 SPI发送数据正确,再次保证MSP-EXP430F5529 SPI接收数据正确。可以发送相同的数据,使用示波器观察,对于slave可以在线调试,直接查看接收值。都正确后,再在5529上添加UART程序。
事实上,TI均有对应例程,
首先附件为MSP430Ware中 G2553的SPI master发送程序;由于只能添加一个附件,下帖续。
Lina Lian:
回复 Lina Lian:
此贴附件为F5529 SPI slave例程。它将接收到的数据,又依次发送出去了。
用这个例程和前面G2553的例程合作,即可看到G2553上面的LED亮了。说明G2553依次发数给5529,后又收到了5529返回的数。数据均正确,LED就会亮。
Ray Hsu:
回复 Lina Lian:
谢谢Lina Lian大,我调试了您给的两个例子,但结果却仍是不正确,但当我将reset pin的连结拿掉后结果就正确了,(Slave的reset pin是从MSP-EXP430F5529板的RST button焊出来的, 不知道是不是这裡有问题)想请教原因是什麽呢?感谢!!
Ray Hsu:
回复 Lina Lian:
不好意思,想再请教一下,
我用范例确实调试出正确的结果(0X01,0X02,0X03,…)但当我将9600波特率调成115200,却一直收到重覆的值(0XFF,0XFF,0XFF,…),请问这可能是什么现象呢?谢谢!
Lina Lian:
回复 Ray Hsu:
Ray Hsu,
你先用示波器看看发送出来的数是什么,发送的波特率是多少?先保证发送正确了。
记得将MSP430 uart程序中调为115200时,user guide中有个表,是相关UART波特率配置参数表,按照那个来。串口调试助手中UART也设置为115200.
希望对你有帮助!O(∩_∩)O~
Ray Hsu:
回复 Lina Lian:
谢谢Lina Lian的回覆,我有试了你的方法。容我先解释一下我的实验 : 我透过g2553 SPI传送递增的data(0x00,0x01,0x02,0x03…)给f5529,f5529再将SPI所收到的值经由UART传回电脑。在baud rate是9600的情况下,电脑确实的收到正确递增数值,但透过示波器看g2553的SPI DOUT接脚,却仅是一连串的方波,如下图。
在baud rate是115200的情况下,电脑不断收到0xFF,g2553的SPI DOUT输出仍如上图。
我的f5529 UART配置如下 :
P4SEL |= BIT4+BIT5; // P3.3,4 = USCI_A0 TXD/RXDUCA1CTL1 |= UCSWRST; // **Put state machine in reset**UCA1CTL1 |= UCSSEL_2; // SMCLKUCA1BR0 = 8; // 1MHz 115200 (see User's Guide)UCA1BR1 = 0; // 1MHz 115200UCA1MCTL |= UCBRS_6 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**找不出原因,再麻烦您指教了!
Lina Lian:
回复 Ray Hsu:
Ray Hsu,
请在观察SPI的输出数据时,把SPI CLK也加进去看,这是我曾经用SPI互传数据时,保存的一个图,你可以清楚的看到发送数据是1,2,3,4,……
你先保证SPI发送和接收到的数据是正确的后,再调UART.
Lina Lian:
回复 Ray Hsu:
Ray Hsu,
对于MSP430F5529而言,你的SMCLK是多大啊?是1MHz,还是默认的1.048576MHz?
参考user guide中的Table 34-4. Commonly Used Baud Rates, Settings, and Errors, UCOS16 = 0设置正确。看你的设置应该是1MHz.