打印
[AVR单片机]

mega16+25lc256读不出数据

[复制链接]
1891|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiongeyes|  楼主 | 2013-6-4 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<iom16v.h>

#define BAUD 9600               //波特率采用9600ps
#define CRYSTAL 8000000           //系统时钟8MHz
#define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)  // 设置波特率
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)      

#define _nop()   #asm("nop")
#define LED_COM  PORTD ^= (1<<PD5)
//25LC256//////////////////////
#define WRSR     0x01    //写状态寄存器
#define WRITE    0x02    //写命令
#define READ     0x03    //读命令
#define WRDI     0x04    //写禁止
#define RDSR     0x05    //读状态寄存器
#define WREN     0x06    //写允许
//PORTB////////////////////////
#define WP       3
#define SS       4
#define MOSI     5
#define MISO     6
#define SCK      7
//PORTD////////////////////////
#define EN_485   4
#define RUN      5

void  delay(unsigned char k) //延时ms
{   
    unsigned char j;
        for (;k>0;k--)
           for(j=220;j>0;j--)
       {
            _nop();  
            _nop();
            _nop();
            _nop();
            _nop();
            _nop();
            _nop();
            _nop();
            _nop();
            _nop();   
       }     
}   
     
////////////////RS232////////////////////
void USART_Init()           //232波特率初始化
{
    UBRRH = BAUD_H;
    UBRRL = BAUD_L;
    UCSRB |= (1<<RXEN)|(1<<TXEN);            //接收器与发送器使能
    UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);        //设置帧格式:8个数据位,1个停止位
}

///////////////458发送///////////////////
void UART_TX485( unsigned char data )   
{
    PORTD |= (1<<EN_485);
    delay(2);     
    while ( !( UCSRA & (1<<UDRE)) );
    UDR = data;
    while(!(UCSRA & (1<<UDRE)));
    delay(4);  
    PORTD &= ~(1<<EN_485);                          // 将数据放入缓冲器,发送数据
}

/////////////////SPI 主机设置//////////////////////////////
void SPI_MasterInit(void)
{        
    DDRB |= (1<<SS)|(1<<MOSI)|(1<<SCK);
    PORTB |= (1<<SS);
    SPCR = (1<<SPE)|(1<<MSTR);// 设置为主机模式,使能SPI,时钟为fosc/4
   
}

////////////////////SPI发送////////////////
void SPI_TX(unsigned char cdata)
{         
    SPDR = cdata;
    while(!(SPSR & (1<<SPIF)));
}
//================================================
//SPI读
//================================================
unsigned char SPIRead(unsigned int SpiAddress)
{
    unsigned char i,add_H,add_L;        
    add_H = SpiAddress >> 8;
    add_L = SpiAddress & 0x00FF;
    PORTB &= ~(1<<SS);       
        SPI_TX(READ);
    SPI_TX(add_H);
    SPI_TX(add_L);
    SPI_TX(0xFF);
    i = SPDR;       
        PORTB |= (1<<SS);
    return i;                       
}
//==================================================
//SPI写
//==================================================
void SPIWrite(unsigned int SpiAddress,unsigned char edata)//*ramadr,unsigned char width)
{
    unsigned char i,add_H,add_L;   
    PORTB &= ~(1<<SS);
    SPI_TX(WREN);   //写使能
    PORTB |= (1<<SS);//锁存写使能命令
        delay(50);
    add_H = SpiAddress >> 8;
    add_L = SpiAddress && 0x00FF;
    PORTB &= ~(1<<SS);   
    SPI_TX(WRITE);
        SPI_TX(add_H);
    SPI_TX(add_L);
    SPI_TX(edata);
        PORTB |= (1<<SS);
}           
//端口初始化///////////////////////////
void PORT_Init()
{
    DDRB = 0x00;
    DDRB |= (1<<WP);
    DDRD |= (1<<EN_485)|(1<<RUN);
    PORTD |= (1<<RUN);
    PORTB |= (1<<WP);   //低电平为写保护,高电平写使能允许
}

//主程序////////////////////////
void main(void)
{   
    unsigned char temp,i;
    i = 0x43;                           
    SREG = 0x00;  
    USART_Init();
    SPI_MasterInit();
    PORT_Init();
    SREG = 0x80;

    while(1)
    {   
        SPIWrite(0x0001,i);
        _nop();
        _nop();
        delay(200);
        temp = SPIRead(0x0001);
        _nop();
        _nop();
        delay(5);
        UCSRB &= ~(1<<RXCIE);
        _nop();
        UART_TX485(temp);
        _nop();
        UCSRB |= (1<<RXCIE);               
        UART_TX485(0x45);
        _nop();
        _nop();         
    }
}  
用cvavr2.03.4写的程序
是不是初始化时要发WRSR命令,写状态寄存,然后写入0X02
麻烦各位看看是否我程序有什么地方错了吗,i=0X43但不管怎么样,写进去, 读出来的永远都是00

相关帖子

沙发
huangxz| | 2013-6-4 18:58 | 只看该作者
拿示波器看一下吧,这类芯片也就时序对了数据肯定是对的

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
板凳
qin552011373| | 2013-6-4 21:03 | 只看该作者
huangxz 发表于 2013-6-4 18:58
拿示波器看一下吧,这类芯片也就时序对了数据肯定是对的

示波器应该够呛吧  是不是要用逻辑分析仪了

使用特权

评论回复
地板
huangxz| | 2013-6-4 22:12 | 只看该作者
qin552011373 发表于 2013-6-4 21:03
示波器应该够呛吧  是不是要用逻辑分析仪了

:lol逻辑分析仪也是可以的,比如40多块钱那种的就很好用

使用特权

评论回复
5
jiongeyes|  楼主 | 2013-6-5 09:01 | 只看该作者
qin552011373 发表于 2013-6-4 21:03
示波器应该够呛吧  是不是要用逻辑分析仪了

两者都没有,有没有推荐一款便宜好用的

使用特权

评论回复
6
qin552011373| | 2013-6-5 09:26 | 只看该作者
huangxz 发表于 2013-6-4 22:12
逻辑分析仪也是可以的,比如40多块钱那种的就很好用

40?

使用特权

评论回复
7
qin552011373| | 2013-6-5 09:27 | 只看该作者
jiongeyes 发表于 2013-6-5 09:01
两者都没有,有没有推荐一款便宜好用的

让楼上推荐一下吧

使用特权

评论回复
8
qin552011373| | 2013-6-5 09:29 | 只看该作者
huangxz 发表于 2013-6-4 22:12
逻辑分析仪也是可以的,比如40多块钱那种的就很好用

40的有哪个牌子的?自己做的吗?

使用特权

评论回复
9
huangxz| | 2013-6-5 09:45 | 只看该作者
qin552011373 发表于 2013-6-5 09:29
40的有哪个牌子的?自己做的吗?

叫saleae8可以测八通道,宝宝上很多的

使用特权

评论回复
10
qin552011373| | 2013-6-5 15:22 | 只看该作者
huangxz 发表于 2013-6-5 09:45
叫saleae8可以测八通道,宝宝上很多的

好心动

使用特权

评论回复
11
gdxizhilang| | 2013-6-5 15:33 | 只看该作者
先用单步调,看看到哪里出问题了。

使用特权

评论回复
12
gdxizhilang| | 2013-6-5 15:35 | 只看该作者
调程序,要慢慢来,一步一步的,我最早什么仪器也没有,自己摸索出来的。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
13
jiongeyes|  楼主 | 2013-6-5 17:12 | 只看该作者
gdxizhilang 发表于 2013-6-5 15:35
调程序,要慢慢来,一步一步的,我最早什么仪器也没有,自己摸索出来的。 ...

我是怀疑我的程序是否有错,我也调过一步一步调,到了写WREN,然后RDSR读出来寄存器WEL位总是0,没有置1
不明白是怎么回事

使用特权

评论回复
14
qin552011373| | 2013-6-6 13:56 | 只看该作者
gdxizhilang 发表于 2013-6-5 15:35
调程序,要慢慢来,一步一步的,我最早什么仪器也没有,自己摸索出来的。 ...

基本都是自己头脑里先运行一下的

使用特权

评论回复
15
gdxizhilang| | 2013-6-6 14:47 | 只看该作者
关键还是要多读手册,有时候有些状态位写1的时候是清空,读得时候就是0啊。
真正弄懂了手册才行。

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝