打印

请大哥大姐们帮忙看下小弟的程序

[复制链接]
1249|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiangbo86|  楼主 | 2008-9-28 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是小弟写的一个LPC2114的SPI程序,
现在的情况是:S0SPDR(SPI0发送数据寄存器)无法写入,硬件仿真的时候S0SPDR复位值是0x7FF(手册上说复位值是0x0000)。



/******************************************
 文件名:main.c
 功能:通过SPI向HC595写数据,驱动数码管显示;
 创建日期:2008-9-22
2002     
 最后修改日期:2008-9-22
********************************************/
#include    "target.h"
#include <LPC21xx.h>
#define        SPCCR    0x08
#define        SPI        0x00001500
#define        SPI_CS    0x20000000                /*P0.29*/
#define        SPI_CTL    0x30

#define   SPI_DATA  0x00000040                /* P0.6  */
#define   SPI_CLK   0x00000010                /* P0.4  */
  
#define   SPI_IOCON    (SPI_CS|SPI_DATA|SPI_CLK)
//*************************
void Delay(uint32 dly);
//void TargetInit(void);
void GpioInit(void);
void SpiInit(void);
void SpiWrite(uint8 data);
//*************************
int main(void)
{    uint8 data,tmp=0;
    const uint8 DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                            0x88,0x83,0xC6,0xA1,0x86,0x8E};
    GpioInit();
    SpiInit();
    while (1)
        {    
            for (data=0 ;data<16 ;data++)
                {    IOCLR0 = 0x20000000;            //使能激活
                    //S0SPDR = DISP_TAB[data];
                    SpiWrite(DISP_TAB[data]);        //发送
                    while ((S0SPSR&0x80)!=1);        //等待发送结束
                    //Delay(10);
                    IOSET0 = IOSET0|SPI_CS;               //使能无效
                    Delay(1000);                    //延时                    
                 }
            
        }
}
//*************************************
void Delay(uint32 dly)                         
{
    uint32    i,j;
    for (i=0 ;i<dly ;i++)
        for (j=0 ;j<250 ;j++)
            {;}
}
//*************************************
/*void TargetInit(void)
{
    //禁止中断

    //PLL设置
    PLLCON = 0x03;                    //使能PLL
    PLLCFG = 
    PLLFEED = 0xAA;
    PLLFEED = 0x55;                    //PLL馈送        
}*/
//*************************************
void GpioInit(void)
{
    PINSEL0 = SPI;            //设置管脚SPI0            
    IODIR0 = SPI_CS;            //设置P0.29为输出
}
//*************************************
void SpiInit(void)
{
    uint8 test;
    IOSET0 = SPI_CS;            //P0.29置高电平
    //S0SPCCR = SPCCR;            //设置SCK频率
    S0SPCR = SPI_CTL;            //禁止SPI中断,位7在先,主模式,SCK低有效,
                                //SCK第一个时钟沿有效,传输从CS信号激活开始
                                //CS信号无效时结束。
    test = S0SPSR;                //第一次仿问SPSR,使能仿问SPDR
}
//*************************************
void SpiWrite(uint8 data)
{
    S0SPDR = data;                    //写数据,启动发送        
}

 /*************************************************

  创建日期:2008-9-22
  最后修改日期:2008-9-22
  *************************************************
  目标板配置文件。

 **************************************************/
 #ifndef __config_h
 #define __config_h
 #ifndef TRUE
 #define TRUE  1
 #endif

 #ifndef FALSE
 #define FALSE 0
 #endif

 typedef unsigned char  uint8;            //无符号8位整型变量 
 typedef signed   char  int8;            //有符号8位整型变量
 typedef unsigned short uint16;            //无符号16位整型变量
 typedef signed   short int16;            //有符号16位整型变量
 typedef unsigned int   uint32;            //无符号32位整型变量
 typedef signed   int   int32;            //有符号32位整型变量
 typedef float          fp32;            //单精度浮点数(32位长度)
 typedef double         fp64;            //双精度浮点数(64位长度)
 
 
 
 //*************************************************
 #define M    4
 #define p    1    
 #define FOSC     11059200                //晶振频率,11M~25M
 #define FCCLK     FOSC*4                    //系统频率,(1~32整数倍Fosc)
 #define FCCO    (FCCLK * 4)             //CCO频率,为Fcclk的2、4、8、16倍
 #define FPCLK    (FCCLK / 4) * 1            //VPB时钟频率,为(Fcclk / 4)的1、2、4倍
  //***************************************************
 #endif




相关帖子

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

本版积分规则

3

主题

6

帖子

0

粉丝