打印
[NXP ARM]

2131的spi的中断问题

[复制链接]
2182|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无冕之王|  楼主 | 2010-3-22 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
  }

相关帖子

沙发
dfsa| | 2010-3-22 22:13 | 只看该作者
很长吗,还好,都像LS的,那郁闷的人可就多了

使用特权

评论回复
板凳
pkat| | 2010-3-28 21:05 | 只看该作者
是的,有时是应该自己先调下,把问题总结下再拿出来问

使用特权

评论回复
地板
gxgclg| | 2010-3-29 20:52 | 只看该作者
可以把WHILE屏蔽掉试一下

使用特权

评论回复
5
yybj| | 2010-3-30 20:44 | 只看该作者
仿真时,有时死在那很正常,具体原因说不清,遇到过,但不影响数据传输

使用特权

评论回复
6
司徒老鹰| | 2010-4-1 15:50 | 只看该作者
确实很奇怪

使用特权

评论回复
7
xsgy123| | 2010-4-1 21:41 | 只看该作者
不奇怪,很正常,看是不是一直死在那

使用特权

评论回复
8
zwll| | 2010-4-5 12:04 | 只看该作者
程序不够强大

使用特权

评论回复
9
xsgy123| | 2010-4-7 16:39 | 只看该作者
应该是程序没优化好

使用特权

评论回复
10
秋天落叶| | 2010-4-11 21:34 | 只看该作者
肯定是软件的问题,不用怀疑

使用特权

评论回复
11
sinadz| | 2010-4-11 22:05 | 只看该作者
是应该先静下心来好好调

使用特权

评论回复
12
zwll| | 2010-4-11 22:42 | 只看该作者
多设立几个断点测试一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:喜欢远行

160

主题

3331

帖子

0

粉丝