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

共2条 1/1 1 跳转至

2131,spi 2131的spi的中断问题

院士
2006-09-17 18:14:16     打赏
2131,spi 2131的spi的中断问题



关键词: 中断     问题    

院士
2006-12-22 22:43:00     打赏
2楼
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[i]=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[i];
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);
  }                        
              
                           

1: 有没有哪位朋友知道这个问题啊有没有哪位朋友知道这个问题啊,很急,谢谢

共2条 1/1 1 跳转至

回复

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