打印

AVR单片机与AT45DB161D通信 急!!!

[复制链接]
1659|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yue366|  楼主 | 2012-9-4 22:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
板子上是Atmega324单片机,想和AT45DB161D进行SPI通信,用的是硬件SPI,可是每次写write_SPI()只运行一次,第二次就再运行write_SPI()程序就卡住了 由于没有示波器 我是通过往串口上打数字发现的,AT45DB161D的库函数是从网上找的 自己也对时序看了下 应该没问题啊 请各位大侠帮小弟看看 谢谢各位啊 憋死我了快
这个是主函数 putchar是往串口输出字符 我实验用的 我就是想往AT45DB161D的buffer写个数组再读出来 可是write_SPI()好像就运行一次就停住了 我感觉是 也不知道是不是这个原因 感觉SPI配的也没错啊 找不出来原因
#include "config.h"
uchar DF_tx_buffer[10];  //发送的
uchar DF_wr_buffer[10];   //存写的
uchar DF_rd_buffer[10];  //存读的

void init_device(void)
{
#asm("cli")
//DDRB|=(1<<5)|(1<<7);
//DDRB&=~(1<<6);
//usart_init();
#asm("sei")
}

void main(void)
{
uint i;
uchar wtemp=0;
uchar rtemp=0;
init_device();
usart_init();
DF_init();
//while(1)
//{
  //putchar(0x02);
  delay_ms(50);
  for(i=0;i<10;i++)
  {
   DF_wr_buffer=0xDD;
  // putchar(DF_wr_buffer);
  }
  putchar(0x11);
  putchar(wtemp);
  wtemp=DF_write_buf(1,0,10);
  putchar(wtemp);
  if(wtemp==1)   
  {
   putchar(0x99);
   rtemp=DF_read_buf(1,0,10);
   putchar(rtemp);
   if(rtemp==1)
   {
     putchar(0x88);
     for(i=0;i<10;i++)
     {
      DF_tx_buffer=DF_rd_buffer;
     }
     for(i=0;i<10;i++)
     {
      putchar(DF_tx_buffer);
      delay_ms(1);
      
     }
   }
}
//}
}


这个是AT45DB161D参考网上库函数相关例程
#include "config.h"

void DF_init()
{
DDRB|=(1<<5);     //MOSI   SPI
//PORTB&=~(1<<5);

DDRB&=~(1<<6);     //MISO   SPI
//PORTB|=(1<<6);

DDRB|=(1<<7);      //SCK     SPI
//PORTB&=~(1<<7);

DDRB&=~(1<<0);
//DDRB|=(1<<0);       //CS 低有效  161D
PORTB&=~(1<<0);

DDRB|=(1<<1);       //RESET 低有效    161D
PORTB|=(1<<1);

DDRB|=(1<<2);     //AD CS
PORTB|=(1<<1);
  
}
//SPI输出一个字节的数据
unsigned char write_SPI(uchar data)
{

//DF_SPI_ON;
//SPCR0=0x5C;
SPDR0=data;
while(!(SPSR0&0x80));
return SPDR0;

//putchar(0xcc);
}

//检查状态寄存器最高位是否忙,等待空闲
void DF_wait_busy(void)
{
uchar state_reg=0x00;
DF_SELECT_1;
//putchar(0x20);
putchar(state_reg);
write_SPI(READ_STATE_REGISTER);
//putchar(0x21);
//write_SPI(0x00);
//putchar(0x22);
//write_SPI(0x00);
//putchar(0x23);
//write_SPI(0x00);
// putchar(0x24);

while((state_reg&0x80)==0)
{
   
    //putchar(0x25);
    state_reg=write_SPI(0x00);
   //state_reg=SPDR;
   // putchar(state_reg);
}
putchar(0x26);
DF_DESELECT_1;
}


//读指定缓冲区指定单元的数据,保存在DF_rd_buffer[]
uchar DF_read_buf(uchar buffer,uint start_address,uint length)
{
uint i;
if((527-start_address)>=length)
{
    DF_SPI_ON;
    DF_wait_busy();
    DF_SELECT_1;
    if(buffer==1)
       write_SPI(BUFFER_1_READ);
    else
       write_SPI(BUFFER_2_READ);
    write_SPI(0x00);
    write_SPI((uchar)(start_address>>8));
    write_SPI((uchar)start_address);
    write_SPI(0x00);
    for(i=0;i<length;i++)
    {
      DF_rd_buffer=write_SPI(0x00);
      //DF_rd_buffer=SPDR;
     putchar(DF_rd_buffer);
    }
    DF_DESELECT_1;
    DF_SPI_OFF;
    return 1;
}
else
    return 0;
}

//将DF_buffer[]数组中指定长度的数据写入指定缓冲区
uchar DF_write_buf(uchar buffer,uint start_address,uint length)
{
uint i;
if((527-start_address)>=length)
{
    DF_SPI_ON;
    DF_wait_busy();
    //putchar(0xaa);
    DF_SELECT_1;
    putchar(0x13);
    if(buffer==1)
       write_SPI(BUFFER_1_WRITE);
    else
       write_SPI(BUFFER_2_WRITE);
    putchar(0x14);
    write_SPI(0x00);
    putchar(0x15);
    write_SPI((uchar)(start_address>>8));
    //putchar(0x16);
    write_SPI((uchar)start_address);
    //putchar(0x17);
    for(i=0;i<length;i++)
    {
     write_SPI(DF_wr_buffer);
     //putchar(DF_wr_buffer);
     //putchar(0xEE);
    }
    DF_DESELECT_1;
    putchar(0x18);
    DF_SPI_OFF;
    return 1;
}
else
   return 0;
}

以下是flash的头文件
#ifndef _flash_H_
#define _flash_H_

//以下为端口配置,需要根据板子上的端口修修改
#define DF_SPI_ON      SPCR0=0x5C
#define DF_SPI_OFF     SPCR0=0x00
#define DF_CON_PORT    PORTB
#define DF_STA_PORT    PINB
#define DF_STATE       2
#define DF_CS_1        0
#define DF_SELECT_1    PORTB&=~BIT(DF_CS_1)
#define DF_DESELECT_1  PORTB|=BIT(DF_CS_1)
// 写入第一缓冲区
#define BUFFER_1_WRITE 0x84  

// 写入第二缓冲区  
#define BUFFER_2_WRITE 0x87

// 读取第一缓冲区
#define BUFFER_1_READ 0xD4

// 读取第二缓冲区
#define BUFFER_2_READ 0xD6

// 将第一缓冲区的数据写入主存储器(擦除模式)
#define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83

// 将第二缓冲区的数据写入主存储器(擦除模式)
#define B2_TO_MM_PAGE_PROG_WITH_ERASE  0x86
// 将主存储器的指定页数据加载到第一缓冲区
#define MM_PAGE_TO_B1_XFER 0x53

// 将主存储器的指定页数据加载到第二缓冲区
#define MM_PAGE_TO_B2_XFER 0x55

// 页删除(每页512/528字节)
#define PAGE_ERASE 0x81

// 扇区擦除(每扇区128K字节)
#define SECTOR_ERASE 0x7C

// 读取状态寄存器
#define READ_STATE_REGISTER 0xD7

//主存储器页读
#define MAIN_MEMORY_PAGE_READ 0xD2

extern unsigned char DF_wr_buffer[528];
extern unsigned char DF_rd_buffer[528];

extern void DF_init();
extern unsigned char write_SPI(unsigned char data);
extern void DF_wait_busy(void);
extern unsigned char DF_read_buf(unsigned char buffer,unsigned int start_address,unsigned int length);
extern unsigned char DF_write_buf(unsigned char buffer,unsigned int
start_address,unsigned int length);

#endif

剩下的就是串口程序了 我是用cvavr生成的例程 应该没问题
希望大家多多指点了 卡一个星期了 也没调试出来 程序总在第二次运行writet_SPI()时候卡住 不知道为什么 还有一点就是SPI的借口和ISP的借口是公用的 不知道有没有影响呀

相关帖子

沙发
yue366|  楼主 | 2012-9-5 12:22 | 只看该作者
没人理啊 那自己顶一下吧 接着卡。。。。。。。。。。。

使用特权

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

本版积分规则

8

主题

32

帖子

2

粉丝