我买了一个TQ2440的开发板,发现上边没有spi的例程,就自己照着写了一个spi控制12864屏的程序,可是屏不出字
我用示波器看nss管脚一直是高电平,这些能说明什么呢?该怎么办呢?
下面是我的程序,有哪里不妥么?请朋友们帮忙啊,谢谢了!
这个程序我自认为 一堆一块 写的比较规范,敢情各位朋友,各位高手帮我看看程序是哪里出了错误,谢谢了
我想实现的是,在GPIO_12864_INIT初始化函数执行对以下两个数组的显示就可以了,但是液晶屏上就是不出字啊
/***************************************
显示字库
***************************************/
const unsigned char GPIO_word3[9]={0xb5,0xb1,0xc7,0xb0,
0xce,0xc2,0xb6,0xc8,0x3a};
unsigned char GPIO_word1[]={"我要好好学习"};
//spi读写函数部分
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
char RXdata=0,TXdata=0;
/************SPI的初始化程序*************
GPG2-----nSS0 GPE11-----MISO
GPE12----MOSI GPE13-----SPICLK
*****************************************/
void spi_poll_done(void);
void init_spi(void)
{
int t;
rSPPRE0=0x18; //PCLK=50M,SPICLK=50/2/(24+1)=1M
rCLKCON|=(1<<18); //使能SPI的时钟模块
Uart_Printf("rCLKCON=%x\n",rCLKCON);
rSPCON0=(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0);
//这句话重点看看,设置SPCONn来正确配制 SPI 模型
//enable ENSCK,master,CPOL=0,CPHA=0,normalmode
for(t=0;t<10;t++)
rSPTDAT0=0xff; //初始化设备
//写数据 0xFF到SPTDATn 10 次来初始化 MMC或SD卡
//rGPGUP&=~(0<<2);
//设置起 nSS 作用的 GPIO引脚为低来激活 MMC或SD卡
//初始化相关io端口设置
rGPECON=rGPECON&~(3<<22)&~(3<<24)&~(3<<26)|(2<<26)|(2<<24)|(2<<22);
//SPI0 configured配置
//GPE11-SPIMISO GPE12-SPIMOSI GPE13-SPICLK
rGPGCON=rGPGCON&~(3<<4)|(3<<4);
//nSS0 bit is input,GPG2-nSS0,直接接地
rGPGUP&=~(1<<2); //enable GPG pull up ,只使能CSn的上拉
rGPEUP=0xffff; //disable GPE pull up 禁用GPE上拉
//初始化SPI设置
//polling mode轮询模式 ,enable ENSCK使能ensck即enable sclk,master,CPOL=0,CPHA=0,normal mode正常模式
rSPPIN0=(0<<2)|(1<<1)|(0<<0); //dis-ENMUL,SBO,release-释放
}
/************SPI发送一个字节**************/
void write_spi(unsigned char data) //write_spi
{
spi_poll_done();
//while(!(rSPSTA0&0x01==0x01)); //SPSTA0的READY是否置位
rSPTDAT0= data;
spi_poll_done();
}
/**************轮询SPI状态***************/
void spi_poll_done(void)
{
while(!(rSPSTA0&0x01==0x01)); //SPSTA0的READY是否置位
}
//rSPSTA0标志位为0时表示数据未准备好 while(!(0&0x01));即while(1);
//满足执行条件 会一直执行while原地循环不会前进
//标志位为1时表示数据准备好 while(0)不满足条件会继续往下执行其他的程序
/*******************************/
//函数名称:
//入口参数:
//出口参数:
//函数功能:向LCD写数据
/******************************/
void GPIO_lcd_write(unsigned char d,unsigned char s)
{
if(s) //s为1,写指令
{
// rGPGCON=rGPGCON&~(1<<4)|(1<<4);
// rGPGUP&=~(0<<2);
//SS=1,打开SPI
write_spi(0xf8); //发11111000启动字节 启动一个周期
write_spi(d&0xf0);
write_spi(d<<4);
// rGPGUP&=~(1<<2);
//SS=0,关闭SPI
if(d==0x01)
Delay(6); //清屏命令延时20ms
else
Delay(1); //基本命令延时2ms
}
else //s=0写数据
{
//SS=1,启动SPI
//rGPGUP&=~(0<<2);
write_spi(0xfa); //写数据
write_spi(d&0xf0); //数据的高4位加4个零
write_spi(d<<4); //数据的低4位加4个零
// rGPGUP&=~(1<<2);
//SS=0,关闭SPI
Delay(1); //基本命令延时1ms
}
}
/*******************************/
//函数名称:
//入口参数:
//出口参数:
//函数功能: LCD初始化
/******************************/
void GPIO_lcd_init(void)
{
Delay(1);
GPIO_lcd_write(0x30,1); //基本指令集动作
GPIO_lcd_write(0x0c,1); //显示器开
GPIO_lcd_write(0x01,1); //清除显示
}
/*******************************/
//函数名称:
//入口参数:
//出口参数:
//函数功能: 液晶内容初始化
/******************************/
void GPIO_lcd_display(void)
{
unsigned char k;
GPIO_lcd_write(0x01,1); //清屏
Delay(1);
GPIO_lcd_write(0x92,1); //第三行:当前温度
Delay(1);
for(k=0;k<9;k++)
{
GPIO_lcd_write(GPIO_word3[k],0);
}
GPIO_lcd_write(0x81,1);
Delay(1);
for(k=0;k<12;k++)
{
GPIO_lcd_write(GPIO_word1[k],0);
}
}
/*******************************/
//函数名称:
//入口参数:
//出口参数:
//函数功能: 显示数字
/******************************/
void GPIO_display_tem(void)
{
Delay(1);
GPIO_lcd_write(0x8B,1); //选择地址
GPIO_lcd_write(7+0x30,0);
GPIO_lcd_write(8+0x30,0);
GPIO_lcd_write(9+0x30,0);
GPIO_lcd_write(0x9B,1); //选择地址
GPIO_lcd_write(9+0x30,0);
GPIO_lcd_write(9+0x30,0);
GPIO_lcd_write(9+0x30,0);
GPIO_lcd_write(9+0x30,0);
Delay(1);
}
/*******************************/
//函数名称:
//入口参数:
//出口参数:
//函数功能: GPIO_12864初始化
/******************************/
void GPIO_12864_INIT(void)
{
init_spi();
GPIO_lcd_init();
GPIO_lcd_display();
GPIO_display_tem();
}
|