打印
[ZLG-ARM]

SPI通信出问题了

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

共地

两块板子共地了吗?

使用特权

评论回复
板凳
huangbingg| | 2008-4-12 12:31 | 只看该作者

为啥要共地啊?

2楼再解释下啊  谢拉

使用特权

评论回复
地板
jstu023123|  楼主 | 2008-4-12 13:29 | 只看该作者

回2楼

  供地了啊,接收的第一个数据是对的。。。如果连续发同一个数据,第一次读的S0PSR为0x88,收到的数据正确,后面读的S0PSR则都为0x80,数据正确。也就是若主机发送一串数据,从机收到第一个数据后,S0PSR从机中止,下面就收不到数据了。。。

使用特权

评论回复
5
jstu023123|  楼主 | 2008-4-12 13:50 | 只看该作者

程序贴出来帮我看看啊。。。

2214主机发送数据是正确的,通过查询方式可以接收到任意字节,就是中断不行
程序如下:
#define  SPI_RCV_BUF  2
static UINT8 rcv_buf[SPI_RCV_BUF];
static BOOL RcvFinished = FALSE;

void __irq  IRQ_SPI0( void )
{
    UINT32 tmp;
    
    tmp = S0PSR;
    rcv_buf[0] = S0PDR;
    rcv_buf[1] = tmp;
    RcvFinished = TRUE;

    S0PINT = 0x01;
    VICVectAddr = 0x00;
 }


void SPI0_Init( void )
{
    PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;   // 设置管脚连接SPI
    S0PCR  =  (1 << 3)|    // CPHA = 0, 数据在SCK 的第一个时钟沿采样
        (1 << 4) |    // CPOL = 1, SCK 为低有效
        (0 << 5) |    // MSTR = 0, SPI 处于从模式
        (0 << 6) |    // LSBF = 0, SPI 数据传输MSB (位7)在先
        (1 << 7);    // SPIE = 1, SPI 中断被使能
 }


void SPI0_INT_Init( void )
{
     VICIntSelect = 0x00;
     VICVectCntl0 = (0x20|10);
     VICVectAddr0 = (UINT32)IRQ_SPI0;
     VICIntEnable |= (1<<10);
 }


UINT8 SPI0_GetData( UINT8 *pBuffer )
{     
    if( RcvFinished==TRUE) 
  { 
    RcvFinished = FALSE;
    
    UART0_COMPuts( rcv_buf,2);
    while( UART0_IsSendFinished()==0 );
    UART0_ClearBuffer( TRUE,TRUE );
    }
   else return FALSE;

    return TRUE;
 }


int main(void )
{
     UINT8 dat[256];
     UINT32 i;
    
    UART0_Init(BPS9600,DB8,SB1,PB0);
    UART0_INTInit( ); 

    SPI0_Init( );
    SPI0_INT_Init( );
    
    IRQEnable( );

    while( 1 )
    {        
        SPI0_GetData( dat );
        for( i=0;i<0x9ffff;i++ );
     }
    return 0;
 }

使用特权

评论回复
6
zlgarm| | 2008-4-12 17:12 | 只看该作者

Re

jstu023123  您好:
请您注意LPC2131的引脚配置等硬件连接问题,您可参考《深入浅出ARM7—LPC213x/LPC214x》上册,SPI跟SSP通信等实验。
                       On duty : zlgarm_liuzhaofu

使用特权

评论回复
7
quhaoccnu| | 2008-4-15 21:45 | 只看该作者

SPI初始化问题

 在《深入浅出ARM7LPC213x》上册的SPI主机实验中初始化接口代码如下:
void  MSPI_Init(void)
{      
    SPCCR = 0x52;                    // 设置SPI时钟分频
     SPCR  = (0 << 3) |     // CPHA = 0, 数据在SCK 的第一个时钟沿采样
             (1 << 4) |     // CPOL = 1, SCK 为低有效
             (1 << 5) | // MSTR = 1, SPI 处于主模式
             (0 << 6) |     // LSBF = 0, SPI 数据传输MSB (位7)在先
             (0 << 7);        // SPIE = 0, SPI 中断被禁止
}

请问SPI时钟分频设置为0x52的依据是什么?
而在《深入浅出ARM7LPC213x》下册的SPI初始化如下:
uint8 SPIInit(uint8 Fdiv)
{
    

    SPI_SPCCR = Fdiv & 0xfe;                    /* 分频值 */
    SPI_SPCR = 0xa0 | SPI_MOD;                  /* 主机、允许中断 */
}
这里的分频值设为0x80 & 0xfe,不同于上册的0x52,且SPCR的设置也不同于上册,ZLG大侠能否解释下?

使用特权

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

本版积分规则

40

主题

93

帖子

0

粉丝