打印
[ZLG-ARM]

有没有人做过SPI从机?我在坛子里找了,没找到答案

[复制链接]
2177|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
twb0906|  楼主 | 2008-9-20 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
walnutcy| | 2008-9-20 11:56 | 只看该作者

SPI从机一般会由CLK信号抖动,而收错数据,

要注意出错标志处理,

没用过LPC的,  用8位机的SPI从机的经验

使用特权

评论回复
板凳
twb0906|  楼主 | 2008-9-20 12:14 | 只看该作者

标志处理上,我已经做过了,还是不行,请往下看。

 SPI初始化
INT8U SPI0SInit(void)
{
    INT16U    stemp;
    INT32U    ltemp;
    //SPI0    引脚定义
    ltemp = PINSEL0;
    ltemp &= 0xffff00ff;//0xffff0cff;            
    ltemp |= 0x00004500;//0x00005100; //SSEL,MOSI,SCK
    PINSEL0 = ltemp;
         stemp = S0PCR;
         stemp &= 0xf003;
         stemp |= 0x0084;    
         S0PCR = stemp; 
    return TRUE;
}
说一下,因为我的是16bit的数据,所以初始化为16bit,但是在初始化时对S0PCR必须要采用读改写的方式,否则初始化会失败。

中断处理:
void SPI0_Exception(void)
{
    INT16U     stemp;
    INT8U    temp;
    OS_ENTER_CRITICAL();
    temp = S0PSR;
    if((temp&0x10)!=0) {    //模式错误
        stemp = S0PCR;
        stemp &= 0xf003;
        stemp |= SPI0_MODE;    //0x0004;
        S0PCR = stemp; 
      //  S0PCR = SPI0_MODE;
    }
    if((temp&0x40)!=0) {    //写冲突
        stemp = S0PDR;
    }
    if((temp&0x80)!=0) {    //SPI 传输完成标志
        SPIData = S0PDR;
        SPIOK = TRUE;  //获得数据后,置标志
    }
    S0PINT = 0x01;    
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}

中断向量初始化
        void VICInit(void)
{
    extern void IRQ_Handler(void);
    extern void Timer0_Handler(void);
    extern void SPI0_Exception(void);
    extern void UART0_Handler(void);
 //   extern void UART1_Handler(void);
  //  extern void EINT0_Handler(void);
    extern void Timer1_Handler(void);

    VICIntEnClr = 0xffffffff;
    VICDefVectAddr = (uint32)IRQ_Handler;
    
    VICVectAddr1 = (uint32)Timer0_Handler;
    VICVectCntl1 = (0x20 | 4);
    VICIntEnable = 1 << 4;
      
    VICVectAddr10 =  (INT32U)SPI0_Exception;
    VICVectCntl10 =  (0x20 | 10);
    VICIntEnable = 1 << 10;
    
    VICVectAddr2 =  (INT32U)UART0_Handler;
    VICVectCntl2 =  (0x20 | 6); 
    VICIntEnable = 1 << 6;
    
  //  VICVectAddr2 =  (INT32U)UART1_Handler;
  //  VICVectCntl2 =  (0x20 | 7); 
  //  VICIntEnable = 1 << 7;
    
  //  VICVectAddr4 =  (INT32U)EINT0_Handler;
 //   VICVectCntl4 =  (0x20 | 14); 
    //VICIntEnable = 1 << 14;
    
    VICVectAddr3 = (uint32)Timer1_Handler;
    VICVectCntl3 = (0x20 | 5);
    VICIntEnable = 1 << 5;
 }

我现在有几点问题,
1,器件手册上有这样一句话:“要求驱动SPI 逻辑的系统时钟速度至少8 倍于SPI”,二个SPI分别是那谁,做从机也要这样考虑吗?
2,我在对SPI状态寄存器初始化对不对?我的主SPI采用的时序在顶楼。
3,为什么进入中断几交后就死机了,是我的中断速度过快,LPC2103的SSEL0脚的有效时的脉冲频率为100K。

使用特权

评论回复
地板
twb0906|  楼主 | 2008-9-20 17:59 | 只看该作者

怎么都没有人说话啊!

  做过了的兄弟们,知道的兄弟们,看过来帮帮忙啊!

使用特权

评论回复
5
chengxupin| | 2008-9-25 08:33 | 只看该作者

关FIQ,IRQ

使用特权

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

本版积分规则

8

主题

44

帖子

2

粉丝