这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » SPI 谁帮我看看SPI的问题?

共2条 1/1 1 跳转至

SPI 谁帮我看看SPI的问题?

院士
2006-09-17 18:14:16     打赏
SPI 谁帮我看看SPI的问题?



关键词: 帮我     看看     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 主机程序:
#include <MSP430x14x.h>
static unsigned char Data[17];
static unsigned char flag=0,j=0;
void main(void)
{
auto int i;

for(i=0;i<17;i++) Data[i]=0;
WDTCTL=WDTPW+WDTHOLD;//CLOSE WATHCDOG
//测试晶振是否起振
BCSCTL1&=~XT2OFF;
do
{
IFG1&=~OFIFG;
for(i=0;i<=0xff;i++);
}
while(( IFG1 & OFIFG)==1);
BCSCTL2|=SELM1+SELS;//MCLK=SMCLK=XT2
//同步信号使能STE控制
P2DIR=0XFF;//输出
P2OUT=0XFE;

//初始化SPI串口
UCTL1=CHAR+SYNC+MM;//SPI主模式,8位数据
UTCTL1|=STC+SSEL0;//选定ACLK(32KHZ晶振)为时钟源,3线SPI模式
UBR01=0x02;//波特率分频因子为2
UBR11=0x00;
UMCTL1=0x00;
UCTL1&=~SWRST;//SWRST复位,USART允许
ME2|=USPIE1;//SPI0模块允许
P5SEL|=0x0F;//P5.0~P5.3为模块占用P5.4,5 = USART0 TXD/RXD
P5DIR=0x0A;//P5.1(SIMO)、P5.3(UCLK)设为输出模式
IE2|=URXIE1;//接收中断允许

//串口初始化
UCTL0=CHAR;
UTCTL0=SSEL1;
UBR00=0X41;
UBR10=0X03;
UMCTL0=0X13;
UCTL0&=~SWRST;
ME1=UTXE0+URXE0;
IE1=URXIE0;
P3SEL |= 0x30; // P3.6,7 = USART0 TXD/RXD
P3DIR |= 0x10;
_EINT();
TXBUF1=0xaa;//开始接收过程
while(1)
{
;;
}
}
interrupt [UART1RX_VECTOR] void UART1RX(void)
{
auto int m;
Data[j]=RXBUF1;
if(flag==0)
{
if(Data[j]==0xFF)
{
flag=1;
j=1;
}
}
else
{
while(( IFG1 & UTXIFG0 )==0);
TXBUF0=Data[j];
for(m=0;m<1200;m++);
j++;
}
if(j<17)
TXBUF1=0xAA;
else
{
j=0;
flag=0;
for(m=0;m<1000;m++);
TXBUF1=0xAA;
}
}
从机程序:
#include <MSP430x13x.h>
static unsigned char Data[17]={0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
static unsigned char m=0;
static unsigned char j;
void main(void)
{
auto int i;
WDTCTL=WDTPW+WDTHOLD;//CLOSE WATHCDOG
//测试晶振是否起振
BCSCTL1&=~XT2OFF;
do
{
IFG1&=~OFIFG;
for(i=0;i<=0xff;i++);
}
while(( IFG1 & OFIFG)==1);
BCSCTL2|=SELM1+SELS;//MCLK=SMCLK=XT2

//初始化SPI串口

UCTL0=CHAR+SYNC;//SPI从模式,8位数据,4线制,时钟信号来自主机
//UTCTL0=CKPH;//选定UCLK为时钟源,4线SPI模式
UBR00=0x02;//波特率分频因子为2
UBR10=0x00;
UMCTL0=0x00;
UCTL0&=~SWRST;//SWRST复位,USART允许
ME1=USPIE0;//SPI0模块允许
P3SEL|=0x0F;//P3.0~P3.3为模块占用
P3DIR=0x04;//P3.2(SOMI)设为输出模式
IE1|=URXIE0;//接收中断允许

TXBUF0=0;//开始接收过程
_EINT();
while(1);
}
interrupt [UART0RX_VECTOR] void UART0RX(void)
{

j=RXBUF0;
if(j==0xAA)
{
TXBUF0=Data[m];//发送字符串
m++;
if(m>=17) m=0;
}
}
问题是:上电时,有时主机从从机接收到正确的数据,有时接收不到或是错误的数据!如果是后者,断电再通电,有时就又会好了!
哪位大侠能看出来是什么问题?

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]