打印

用液晶显示出来的数据一直是255

[复制链接]
1807|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyf部长|  楼主 | 2014-4-15 21:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我参照书上的实例写的一个程序,如题所述,用示波器测试表明读写功能都没问题,有波形出来,但是用液晶显示出来的数据一直是255,Debug调试显示的也是0xff,检查不出哪儿错了?大伙儿给点建议

相关帖子

沙发
juventus9554| | 2014-4-15 21:40 | 只看该作者
上ti官网下载个例程,对照着看看吧,你又没有程序给看

使用特权

评论回复
板凳
llljh| | 2014-4-15 21:43 | 只看该作者
八层是你的时序不对

使用特权

评论回复
地板
dingy| | 2014-4-15 21:43 | 只看该作者
楼主,很明显的你的片外flash中要写的数据一直就没有写进去的啊,从擦xie后的flash中独处的数据党然都是0xff啦

使用特权

评论回复
5
zyf部长|  楼主 | 2014-4-15 21:47 | 只看该作者
有什么好的办法检测数据是否写到flash上么?

使用特权

评论回复
6
zyf部长|  楼主 | 2014-4-15 21:49 | 只看该作者
void write_byte(char byte)      //write byte
{  
   U0TXBUF=byte;
  while((IFG1&UTXIFG0)==0);
   IFG1&=~UTXIFG0;
}

char read_byte()           //read byte
{
   char byte;  
   U0TXBUF=0Xff;            //register clear
   while((IFG1&UTXIFG0)==0);
   IFG1&=~UTXIFG0;
   while((IFG1&URXIFG0)==0);
  byte=U0RXBUF;
   IFG1&=~URXIFG0;
   return(byte);   
}

void busy()                 //check busy
{
     char i;
     Enable;  
      write_byte(0x05);      //Read Status Register
      while(1)
      {
       i=read_byte();   
      i&=0x01;
       if(i==0)
      {
         Disable;
         break;
       }
      }
}

void write_enable()         //WREN    06H
{
   busy();
   Enable;
   write_byte(0x06);         //write  enable
   Disable;
  busy();
}

void write_data(char add1,char add2,char add3,char sample)
{
   write_enable();
  
   //Enable;  
   //write_byte(0x05);      //Read Status Register
  //state = read_byte();
   //Disable;
   
   Enable;
   write_byte(0x02);     //write  02H
  write_byte(add1);
   write_byte(add2);
   write_byte(add3);
   write_byte(sample);
   Disable;  
   busy();
}

char read_data(char add1,char add2,char add3)
{
   busy();
   Enable;
   write_byte(0x03);    //read data
   write_byte(add1);
   write_byte(add2);
   write_byte(add3);   
   data = read_byte();
   Disable;
   busy();
   return(data);  
}

void bulk_erase()       //chip erase
{
   write_enable();
   busy();
   Enable;
   write_byte(0xc7);
   Disable;
   busy();  
}

这是我用到的几个子程序,各位看看时序是否不对,我感觉是严格按照手册来的

使用特权

评论回复
7
chuxh| | 2014-4-15 21:52 | 只看该作者
敢问楼主,你这是用单片机自身的SPI总线么?

使用特权

评论回复
8
chuxh| | 2014-4-15 21:52 | 只看该作者
若是的话,可不可以把你初始化SPI总线的初始化部分的代码贴出来的啊

使用特权

评论回复
9
supernan| | 2014-4-15 21:55 | 只看该作者
楼主在线仿真啊,你通过单片机往flash中写一个字节0xaa,然后再通过单片机读出来,一看就知道写没写成功的啊

使用特权

评论回复
10
zyf部长|  楼主 | 2014-4-15 21:55 | 只看该作者
#include<msp430x16x.h>
#define spi_cs BIT7
#define Enable P2OUT &=~spi_cs
#define Disable P2OUT |=spi_cs

char data,state;

void int_spi()
{  
   
   P2DIR|=spi_cs;            //p2.7  spi_cs
   U0CTL|=CHAR+SYNC+MM+SWRST;//8-bit data,spi mode,USART is master
   U0TCTL|=SSEL1+SSEL0+STC;  //3 pin AND SMCLK AS SPI CLOCK   
  U0TCTL|=CKPH;
   U0TCTL&=~CKPL;            //CKPL CKPH:01 rising Write data
   U0BR0=0X02;
   U0BR1=0X00;
   U0MCTL=0X00;              //Baud Rate set
   ME1 |= USPIE0;              //enable SPI
   U0CTL &= ~SWRST;            //reset disable
   IE1 &= ~UTXIE0;             //RX interrupt enable
   IE1 &= ~URXIE0;             //TX interrupt enable
   P3SEL |= 0x0E;              //p3.1 SIMO,p3.2 SOMI,p3.3 clk
   P3DIR |= BIT1 + BIT3;       //p3.1  p3.3 output
   _EINT();
}

这个是初始化部分,这部分一般不会错吧

使用特权

评论回复
11
zyf部长|  楼主 | 2014-4-15 21:58 | 只看该作者
supernan 发表于 2014-4-15 21:55
楼主在线仿真啊,你通过单片机往flash中写一个字节0xaa,然后再通过单片机读出来,一看就知道写没写成功的 ...


测试的时候不能随便写入一个数么?非要写入0xaa?

使用特权

评论回复
12
zyf部长|  楼主 | 2014-4-15 21:58 | 只看该作者
刚试了下,写入0xaa,还是输出0xff

使用特权

评论回复
13
zyf部长|  楼主 | 2014-4-15 22:00 | 只看该作者
#include<msp430x16x.h>

#include"12864.h"
#include"spi.h"


char addr1 = 0,addr2 = 0,addr3 = 0;
char map[10] = {'0','1','2','3','4','5','6','7','8','9'};
char value;

void test()
{
   char a,b,c,d,e;
   int_spi();
   bulk_erase();
   delaynms(2000);
   
   addr1 = 0;addr2 = 0;addr3 = 0;
   write_data(addr1,addr2,addr3,0xaa);
   delaynms(50);
     
  value = read_data(addr1,addr2,addr3);
     
    a = value/10000;
     b = value%10000/1000;
     c = value%1000/100;
     d = value%100/10;
     e = value%10;
     write(0,1);
     write(0,0x80);
     write(1,map[a]);
     write(0,0x81);
     write(1,map[b]);
     write(0,0x82);
     write(1,map[c]);
     write(0,0x83);
     write(1,map[d]);
     write(0,0x84);
     write(1,map[e]);
}

顺便加上读写的主函数部分,一并感谢大家持续的关注和建议

使用特权

评论回复
14
liuzaiy| | 2014-4-15 22:00 | 只看该作者
楼主,很明显的你的片外flash中要写的数据一直就没有写进去的啊,从擦xie后的flash中独处的数据党然都是0xff啦

我也这么认为。

使用特权

评论回复
15
zyf部长|  楼主 | 2014-4-15 22:02 | 只看该作者
确实是写操作子函数的问题,现在问题解决了,我在写使能前将寄存器清零,最后再加上不可写就正常了,感谢大家的持续关注与建议,O(∩_∩)O~

使用特权

评论回复
16
juventus9554| | 2014-4-15 22:03 | 只看该作者
这个东西有写入保护功能的。先把这个功能去掉,在状态寄存器里面,好象大容量的有两个这样的状态寄存器

使用特权

评论回复
17
zyf部长|  楼主 | 2014-4-15 22:04 | 只看该作者
哦,我知道了,多谢大家

使用特权

评论回复
18
zyf部长|  楼主 | 2014-4-15 22:05 | 只看该作者
那就结贴了哈

使用特权

评论回复
19
通宵敲代码| | 2014-4-16 16:57 | 只看该作者
数据没有写到液晶里面去,查时序!

使用特权

评论回复
20
houjiakai| | 2014-4-17 10:24 | 只看该作者
你应该按照字符串写的吧

使用特权

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

本版积分规则

694

主题

7102

帖子

8

粉丝