天嵌 ARM开发社区

 找回密码
 注册
查看: 2660|回复: 4

TQ2440spi写12864的问题

[复制链接]
jjkwz 发表于 2012-5-22 16:53:25 | 显示全部楼层 |阅读模式
我买了一个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();
}

TQ_guoxixiao 发表于 2012-5-23 09:19:46 | 显示全部楼层
希望各位网友,互相帮助。
messi 发表于 2012-12-13 18:50:59 | 显示全部楼层
硬件是怎么是实现的呢??
秋天de誓言 发表于 2013-7-16 16:15:47 | 显示全部楼层
哥们   有2440 SPI的裸跑程序吗  ADS的  跪求!!!!!!!!
秋天de誓言 发表于 2013-7-16 16:16:15 | 显示全部楼层
直接发328554901@qq.com    谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-6 13:57 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表