2131开发板问题:我自己写了一段程序,大体和例程差不多,是以spi为主机,ssp为从机,但总是在判断spi状态寄存器的spif位上死循环,后我把书中的程序拷贝了,但出现了无法产生读中断,不知道为什么,我确认连线没问题 ,请大侠帮忙解答这两个问题,以下是我写的程序:
#include "config.h"
#define key1 1<<17 //key1---p0.16
#define key2 1<<18 //key2---p0.17
#define led1 1<<18 //led1---p1.18
#define led2 1<<19 //led2---p1.19
#define led3 1<<20 //led3---p1.20
#define led4 1<<21 //led4---p1.21
#define led5 1<<22 //led5---p1.22
#define led6 1<<23 //led6---p1.23
#define led7 1<<24 //led7---p1.24
#define led8 1<<25 //led8---p1.25
#define hc595 1<<29
#define slave_cs 1<<28 //p0.28作为ssp作为从机的片选信号
#define beep 1<<7
unsigned char recv_flag;
unsigned int recv_temp;
unsigned int recv_lib[16];
uint8 display[16] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E};
unsigned int i;
/*1***********************************************************/
void delay(unsigned char n) //延时
{。。。。。。
}
/*2**********************************************************/
void looplighting(void) //跑马等循环点亮子程序
{
。。。。。。。。。
}
/*3***********************************************************/
void ssp_initial(void) //ssp初始化
{
SSPCR0=(1<<8)| //SCR设置为1
(0x03<<7)| //CPHA=1,CPOL=1
(0x00<<5)| //帧格式选用spi
(7<<0) ; //数据长度选用8位
SSPCR1=(0<<3)| //从机输出禁能
(1<<2)| //设置ssp为从机
(1<<1)| //ssp使能
(0<<0); //禁能回写模式
SSPCPSR=0x04; //f=(pclk/(cpsdvsr*(scr+1))=pclk/(4*(1+1))
SSPICR=0X03; //清除中断
}
/*4*************************************************************/
void spi_initial(void) //isp初始化
{
S0PCR=(0x03<<4)| //spi的控制寄存器CPHA=1,CPOL=1
(1<<5)| //设置spi为主机
(0<<6)| //spi传送msb在先
(1<<7); //spi中断使能
SPCCR=0x08; //spi的spccr必须大于等于8,因而spi速率最大为fpclk的1/8
S0PINT=0x00; //中断清零
}
/*5***************************************************************/
void __irq read_from_spi(void)
{
recv_temp=SSPDR; //接收数据
recv_lib=recv_temp;
if(i<16)
{
i++;
}
else i=0;
recv_flag=1;
SSPICR=0x03; //清除中断
VICVectAddr=0x00;
}
/*7****************************************************************************/
void ssp_send_data(void) //ssp驱动数码管
{
IO0CLR=hc595 ;
SSPDR=recv_lib;
if(i<16)
i++;
else i=0;
while((SSPSR&0x01)==0);
return;
}
/*8***********************************************************************/
void spi_send_data(unsigned char *data_pointer)
{
IOCLR=slave_cs;
SPDR=(*data_pointer);
while((S0PSR&0x80)==0); //程序运行到这里死循环
IOSET=slave_cs;
return;
}
int main(void)
{
unsigned char n=3,j;
unsigned char *p;
p=display;
PINSEL0=0x00005500; //p0.4(9:8=01)-sck0 ,p0.5(11:10=01)-miso0
//p0.6(13:12=01)-mosi0, p0.7(15:14=01)-sel0
PINSEL1=0x000002a9; //p0.16(1:0=01)-eint0,p0.17(3:2=10)-sck1,
//p0.18(5:4=10)-miso1,p0.19(7:6=10)-mosi1
//p0.20(9:8=10)-ssel1,
IO1SET=(led1|led2|led3|led4|led5|led6|led7|led8);
IO1DIR=(led1|led2|led3|led4|led5|led6|led7|led8);
ssp_initial(); //ssp初始化
spi_initial(); //isp初始化
IRQEnable();
VICIntSelect=0x00000000;
VICVectCntl0=0x20|14 ; //使能spi0,
VICVectAddr0=(uint32)read_from_spi; //设置中断服务程序地址
VICIntEnable=(1<<0x0a); //允许spi0,eint0
for(j=0;j<16;j++)
{
spi_send_data(p);
delay(n);
IO0SET=slave_cs; //片选信号拉高进入主机模式
S0PCR=(1<<5); //S0PCR 的 MSTR位置1,把spi设置为主机
if(recv_flag==0)
ssp_send_data();
delay(n);
}
return (0);
} |