以下是小弟写的一个LPC2114的SPI程序,<br />现在的情况是:S0SPDR(SPI0发送数据寄存器)无法写入,硬件仿真的时候S0SPDR复位值是0x7FF(手册上说复位值是0x0000)。<br /><br /><br /><br />/******************************************<br /> 文件名:main.c<br /> 功能:通过SPI向HC595写数据,驱动数码管显示;<br /> 创建日期:2008-9-22<br />2002 <br /> 最后修改日期:2008-9-22<br />********************************************/<br />#include "target.h"<br />#include <LPC21xx.h><br />#define SPCCR 0x08<br />#define SPI 0x00001500<br />#define SPI_CS 0x20000000 /*P0.29*/<br />#define SPI_CTL 0x30<br /><br />#define SPI_DATA 0x00000040 /* P0.6 */<br />#define SPI_CLK 0x00000010 /* P0.4 */<br /> <br />#define SPI_IOCON (SPI_CS|SPI_DATA|SPI_CLK)<br />//*************************<br />void Delay(uint32 dly);<br />//void TargetInit(void);<br />void GpioInit(void);<br />void SpiInit(void);<br />void SpiWrite(uint8 data);<br />//*************************<br />int main(void)<br />{ uint8 data,tmp=0;<br /> const uint8 DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,<br /> 0x88,0x83,0xC6,0xA1,0x86,0x8E};<br /> GpioInit();<br /> SpiInit();<br /> while (1)<br /> { <br /> for (data=0 ;data<16 ;data++)<br /> { IOCLR0 = 0x20000000; //使能激活<br /> //S0SPDR = DISP_TAB[data];<br /> SpiWrite(DISP_TAB[data]); //发送<br /> while ((S0SPSR&0x80)!=1); //等待发送结束<br /> //Delay(10);<br /> IOSET0 = IOSET0|SPI_CS; //使能无效<br /> Delay(1000); //延时 <br /> }<br /> <br /> }<br />}<br />//*************************************<br />void Delay(uint32 dly) <br />{<br /> uint32 i,j;<br /> for (i=0 ;i<dly ;i++)<br /> for (j=0 ;j<250 ;j++)<br /> {;}<br />}<br />//*************************************<br />/*void TargetInit(void)<br />{<br /> //禁止中断<br /><br /> //PLL设置<br /> PLLCON = 0x03; //使能PLL<br /> PLLCFG = <br /> PLLFEED = 0xAA;<br /> PLLFEED = 0x55; //PLL馈送 <br />}*/<br />//*************************************<br />void GpioInit(void)<br />{<br /> PINSEL0 = SPI; //设置管脚SPI0 <br /> IODIR0 = SPI_CS; //设置P0.29为输出<br />}<br />//*************************************<br />void SpiInit(void)<br />{<br /> uint8 test;<br /> IOSET0 = SPI_CS; //P0.29置高电平<br /> //S0SPCCR = SPCCR; //设置SCK频率<br /> S0SPCR = SPI_CTL; //禁止SPI中断,位7在先,主模式,SCK低有效,<br /> //SCK第一个时钟沿有效,传输从CS信号激活开始<br /> //CS信号无效时结束。<br /> test = S0SPSR; //第一次仿问SPSR,使能仿问SPDR<br />}<br />//*************************************<br />void SpiWrite(uint8 data)<br />{<br /> S0SPDR = data; //写数据,启动发送 <br />}<br /><br /> /*************************************************<br /><br /> 创建日期:2008-9-22<br /> 最后修改日期:2008-9-22<br /> *************************************************<br /> 目标板配置文件。<br /><br /> **************************************************/<br /> #ifndef __config_h<br /> #define __config_h<br /> #ifndef TRUE<br /> #define TRUE 1<br /> #endif<br /><br /> #ifndef FALSE<br /> #define FALSE 0<br /> #endif<br /><br /> typedef unsigned char uint8; //无符号8位整型变量 <br /> typedef signed char int8; //有符号8位整型变量<br /> typedef unsigned short uint16; //无符号16位整型变量<br /> typedef signed short int16; //有符号16位整型变量<br /> typedef unsigned int uint32; //无符号32位整型变量<br /> typedef signed int int32; //有符号32位整型变量<br /> typedef float fp32; //单精度浮点数(32位长度)<br /> typedef double fp64; //双精度浮点数(64位长度)<br /> <br /> <br /> <br /> //*************************************************<br /> #define M 4<br /> #define p 1 <br /> #define FOSC 11059200 //晶振频率,11M~25M<br /> #define FCCLK FOSC*4 //系统频率,(1~32整数倍Fosc)<br /> #define FCCO (FCCLK * 4) //CCO频率,为Fcclk的2、4、8、16倍<br /> #define FPCLK (FCCLK / 4) * 1 //VPB时钟频率,为(Fcclk / 4)的1、2、4倍<br /> //***************************************************<br /> #endif<br /><br /><br /><br /><br /> |
|