以下是小弟写的一个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
|