打印

LPC2103 SPI 发不出数据

[复制链接]
3231|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
6019赵文|  楼主 | 2010-4-17 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了个SPI的程序,但调试时,总跳不出while(!(S0SPSR & 0x80)); 这个循环,啥原因?是不是初始化有问题,但我初始化都是根据SPI0四个引脚进行初始化了。

程序如下:请叫高手了



#include "lpc2103.h"
unsigned char const disp_tab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                            0x88,0x83,0xC6,0xA1,0x86,0x8E};
#define NSS (1<<7)   //连接SPI0的SSEL管脚
void delay(unsigned int count)
{
  unsigned int i;
  for(;count>0;count--)
      for(i=0;i<5000;i++);
}
void spi_int(void)
{
   S0SPCCR |= 0x52;          //设置SPI时钟分频

   S0SPCR = (0<<3)|          //CPHA=0,数据在SCK的第一个时钟采样
              (1<<4)|          //CPOL=1,SCK低电平有效
              (1<<5)|          //MSTR=1,SPI处于主模式
              (0<<6)|          //LSBF=0,SPI数据传输MSB(bit7)在先
              (0<<7);          //SPIE=0,SPI中断禁止  
   
}

unsigned char send_data(unsigned char data)
{
    delay(50);
   //IOCLR=NSS;
S0SPDR=data;   
    while(!(S0SPSR & 0x80)); //等待SPIF置位
S0SPSR |= 0x80;    //清除SPIF
//IOSET=NSS;
return(S0SPDR);
}

int main(void)
{
//    unsigned char rcv_data;
  unsigned char i;
  PINSEL0|=0x00005500;   //设置SPI0管脚连接
  PINSEL1|=0x00000000;
  IODIR=NSS;
  spi_int();
  while(1)
  {
     for(i=0;i<16;i++)
  {  
      IOCLR=NSS;  //主机发出片选信号,低电平有效
      send_data(disp_tab);
   IOSET=NSS; //已发完数据,片选拉成高电平
  // delay(50);
  }
  }
//    return(0);                 
}



相关帖子

沙发
LPC300| | 2010-4-17 14:48 | 只看该作者
我碰到了跟你一样的问题,这句话我有三个板子跑得可以,换了个板子和芯片就不行了,真不知道NXP做的是什么破东西,都要骂娘了!!!

使用特权

评论回复
板凳
6019赵文|  楼主 | 2010-4-23 19:01 | 只看该作者
LZ解决了吗?期待正解!

使用特权

评论回复
地板
ELIANRONG| | 2010-6-8 16:31 | 只看该作者
?????????

使用特权

评论回复
5
machunshui| | 2010-6-8 16:52 | 只看该作者
NXP 出问题的可能性小

使用特权

评论回复
6
wxw2000| | 2010-6-8 16:59 | 只看该作者
1、查看寄存器值是否与手册上一致
2、将片选有效放到for循环外试试
      IOCLR=NSS;  //主机发出片选信号,低电平有效

不知楼主spi是对什么进行操作的?貌似有些读spi数据需要虚写一个字节

使用特权

评论回复
7
wxw2000| | 2010-6-8 17:01 | 只看该作者
本帖最后由 wxw2000 于 2010-6-9 11:20 编辑

汗,这么老的贴都被翻出来了

使用特权

评论回复
8
chistopher| | 2010-6-9 11:27 | 只看该作者
期待问题的答案:dizzy:

使用特权

评论回复
9
TANG2008| | 2010-6-18 12:59 | 只看该作者
你试着把启动代码中用户堆和栈的占用空间改大一点。如USR_Stack_Size  EQU     0x00000800。试一下看行不?

使用特权

评论回复
10
lxr89c51| | 2010-6-26 10:36 | 只看该作者
请仔细检查自己的问题吧。NXP的问题是0%!

使用特权

评论回复
11
思行合一| | 2010-6-27 13:10 | 只看该作者
是硬件上的原因是不是?

使用特权

评论回复
12
hotpower| | 2010-7-4 08:05 | 只看该作者
13
jj9834| | 2014-6-19 22:20 | 只看该作者
给你一个成功的例子比看好吧.
#include "LPC2103.h"
#define    HC595_RCK   0x01<<7 //74HC595锁存位
const unsigned char  SEGMENT_DATA[16] = {
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
  0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E };




void Delay(int count)
{
   unsigned short k;
   while(count--)
   {
     for(k=0; k<1000; k++);
   }
}




/***************************************************************************
* 函数名称:void SPI_Init(void)
* 功能描述:SPI接口初始化。
* 入口参数:无
* 出口参数:无
* 全局变量: IO0DIR,IO0CLR
* 调用模块: 无
***************************************************************************/



void SPI_Init(void)
{
    PINSEL0=(PINSEL0&(~(1<<8)))|(1<<8);   //p0.4 设置为SCK0
        PINSEL0=(PINSEL0&(~(1<<12)))|(1<<12); //p0.6 设置为MOSI0
        IODIR|=HC595_RCK ;//P0.7 设为74HC595锁存位为输出
        IOCLR|=HC595_RCK; //不锁存
        S0SPCCR=0x10;//设置速率(864000)为最高速度即PFCLK的8分之一
        S0SPCR=(0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
           (0 << 4) | // CPOL = 0, SCK 为低有效
           (1 << 5) | // MSTR = 1, SPI 处于主模式
           (0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
           (0 << 7); // SPIE = 0, SPI 中断被禁止
       
}
/***************************************************************************
* 函数名称:void WriteByte(U8 data)
* 功能描述:向SPI总线上写一个字节的数据。
* 入口参数:U8 data
* 出口参数:无
* 全局变量: IO0SET,IO0CLR
* 调用模块: 无
***************************************************************************/

/*74HC595上升沿存数据,*/
void WriteByte(unsigned char data)
{
  IOCLR|=HC595_RCK; //不锁存,存数据,
  S0SPDR=data;
while((S0SPSR&0x80)==0)        ; //等待发送完成
  IOSET|=HC595_RCK; //锁存数据
}
/***************************************************************************
* 函数名称:void PLL_Init(void)
* 功能描述:向SPI总线上写一个字节的数据。
* 入口参数:无
* 出口参数:无
* 全局变量: IO0SET,IO0CLR
* 调用模块: 无
***************************************************************************/
void PLL_Init(void)
{
  
   //倍频M为5,分频P为是2 ,CCLK =11059200 *5=55296000  pclk=11059200 *5/4=13824000  用到串口通信M倍频最好是4;
        PLLCON = 1;
        APBDIV = 0;     //VPB总线时钟Pclk为1/4 CCLk(处理器时钟)
        PLLCFG = 0x24;  // //倍频M为5,分频P为是2
        PLLFEED = 0xaa;
        PLLFEED = 0x55;
  while((PLLSTAT & (1 << 10)) == 0);                PLLCON = 3;
    PLLFEED = 0xaa;
        PLLFEED = 0x55;
               
}
/********************************************************************************************************
*
* 函数名称:DataDisp(uint8 data,uint8 n)
*
* 功能描述:数据字符显示控制。显两位16进制数
*
* 入口参数:data 要显示的数据,取值0~15,n 选择第n个数码管,取值0~3
* 出口参数:无
*
* 全局变量: 无
* 调用模块: HC595_SendData(uint8 data);
*
********************************************************************************************************/   

  void DataDisp(unsigned char data,unsigned char n)
  {
    if(data<16)
    {                                                          
               
                        WriteByte(~SEGMENT_DATA[data]);        //数据选择
                        WriteByte(~(1<<n)); //位选择
    }
  }


       
        /******ARM查询方式SPI总线输出到74HC595驱动数码管*******/
int main(void )
{
  
  
  
  
  PLL_Init();                           //锁相环初始化
  SPI_Init();                           //SPI端口初始化
  
  while(1)
  {
    DataDisp(5,0);                                        // 第一个数码管显示5
    Delay(2);                                                // 延时
   
    DataDisp(2,1);                                        // 第二个数码管显示‘1’
    Delay(2);                                                // 延时
   
    DataDisp(3,2);                                        // 第三个数码管显示‘2’
    Delay(2);                                                // 延时
   
    DataDisp(4,3);                                        // 第四个数码管显示‘3’
    Delay(2);                                                // 延时
  }
}

使用特权

评论回复
14
jj9834| | 2014-6-22 20:59 | 只看该作者
LPC2103 S0SPCR共11位, 2位=1  BitEnable 0 SPI 控制器每次传输发送和接收数据的8 位 11:8默认为000即每次传输16次.

使用特权

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

本版积分规则

350

主题

1515

帖子

1

粉丝