板子上是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的借口是公用的 不知道有没有影响呀 |