|
发表于 2008-7-28 00:36:09
|
显示全部楼层
我可以读出状态码,但读产家ID的时候总是0XFF,不知道是怎么回事,请指点一下
//AT45DB041D-SPI-16.c
#include <iom16v.h>
#include <macros.h>
#include <string.h>
#include "AT45DB041D-SPI-16.h"
/************************************************************
*AT45DB041D全局变量
************************************************************/
unsigned char Write_Buffer[264];
unsigned char Read_Buffer[264];
unsigned int Read_Buffer_Addr =0;
unsigned int Write_Buffer_Addr=0;
unsigned int Read_Buffer_Size =0;
unsigned int Write_Buffer_Size=0;
unsigned int Read_Page_Addr =0;
unsigned int Write_Page_Addr =0;
/************************************************************
*SPI宏定义
************************************************************/
#define SPI_DDR DDRB
#define SPI_PORT PORTB
#define SPI_PIN PINB
#define SS 4
#define SCK 7
#define MOSI 5
#define MISO 6
#define RESET 3
/************************************************************
*AT45DB041D宏定义
*RST由硬件实现(接WatchDog的复位脚)
************************************************************/
#define Enable_DFLASH() SPI_PORT&=~(1<<SS) //使能DataFlash
#define Disable_DFLASH() SPI_PORT|=(1<<SS) //禁止DataFlash
/************************************************************
*Init SPI Port
************************************************************/
void SPI_Port_Init(void)
{
SPI_DDR |= ((1<<SS)|(1<<SCK)|(1<<MOSI));
//SPI_DDR &=~ (1<<MISO);
SPI_PORT |= ((1<<SS)|(1<<SCK))|(1<<MOSI);
//SPI_PORT &=~ ((1<<SCK)|(1<<MOSI));
SPI_DDR|=(1<<RESET);
}
/************************************************************
*初始化SPI
************************************************************/
void SPI_Init(void)
{
SPI_Port_Init();
// SPI中断禁止, SPI使能, master模式, MSB 前, SPI 模式 3, SCK频率Fcl/4
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA);//mode 3
//SPSR |= (1<<SPI2X);
}
/************************************************************
*DataFlash Init
************************************************************/
void DataFlash_Init(void)
{
SPI_Init();
}
/************************************************************
*SPI send a Byte
************************************************************/
void SPI_Write_Byte(unsigned char cData)
{
SPDR = cData; //write data
while(!(SPSR & (1<<SPIF))); //wait write ok
}
/************************************************************
*SPI Read char
************************************************************/
unsigned char SPI_Read_Byte(unsigned char cData)
{
SPDR = cData; //write data
while(!(SPSR & (1<<SPIF))); //wait receive ok
return SPDR; //返回数据
}
/************************************************************
************************************************************/
unsigned char DF_Read_status_Register(void)
{
unsigned char rData=0;
Enable_DFLASH();
SPI_Write_Byte(Status_Register_Opcode);//write opcode
rData = SPI_Read_Byte(0x00);//read device's status
rData = SPI_Read_Byte(0x00);//read device's status
rData = SPI_Read_Byte(0x00);//read device's status
rData = SPI_Read_Byte(0x00);//read device's status
Disable_DFLASH();
PORTA=rData;
return rData;
}
/************************************************************
*check busy status
*返回1表示不忙,否则为忙
************************************************************/
void DF_Check_Busy_State(void)
{
unsigned char state;
while(1)
{
state=DF_Read_status_Register();
if(state & 0x80) //读取的最高位0时器件忙
break;
}
PORTA=state;
}
/************************************************************
*该函数为了测试该芯片有没有正常运行,正常会返回0X1F
************************************************************/
unsigned char DF_Manufacturer_and_Device_ID(void)
{
unsigned char i;
unsigned char ID_Inf[4]={0,0,0,0};
DF_Check_Busy_State();
Enable_DFLASH();
SPI_Write_Byte(Device_ID_Opcode);
for(i=0;i<4;i++)
{
ID_Inf = SPI_Read_Byte(0);
}
for(i=0;i<4;i++)
{
ID_Inf = SPI_Read_Byte(0);
}
Disable_DFLASH();
if(ID_Inf[0] == 0x1F) return 1;//这里只判断产家ID
PORTA=ID_Inf[0];
return 0;
}
/************************************************************
************************************************************/
void main_delay(unsigned int n);
void DF_Reset(void)
{
SPI_PORT&=~(1<<RESET);
main_delay(10);
SPI_PORT|=(1<<RESET);
main_delay(10);
}
/************************************************************
************************************************************/
void main_delay(unsigned int n)
{
unsigned int i;
unsigned int j;
for(i=0;i<n;i++)
{
for(j=0;j<255;j++)
{
asm("nop");
}
}
}
/************************************************************
************************************************************/
void main(void)
{
main_delay(1000);
DDRA =0XFF;
PORTA=0X88;
DataFlash_Init();
DF_Reset();
DF_Check_Busy_State();
while(1)
{
DF_Manufacturer_and_Device_ID();
main_delay(10);
}
}
//AT45DB041D-SPI-16.h
#ifndef _AT45DB041D_H
#define _AT45DB041D_H
//设置Page Size的大小
//芯片默认为264 bytes
#define Page_Size_264 //如果有定义Page_Size_264则AT45DB041D全部Page Size为264计算,
//否则以256计算
//AT45DB041D有两个缓冲区Buffer1和Buffer2 (SRAM)
#define Buffer1 1
#define Buffer2 2
#define ReadBuffer 1
#define WriteBuffer 2
/******************************
*opcode-操作码
******************************/
#define Status_Register_Opcode 0xD7
#define Device_ID_Opcode 0x9F
//Read from buffer
//#define Read_Data_from_Buffer1 0xD4
#define Read_Data_from_Buffer1 0xD1 //lower frequency
//#define Read_Data_from_Buffer2 0xD6
#define Read_Data_from_Buffer2 0xD3 //lower frequency
//Write to buffer
#define Write_Data_to_Buffer1 0x84
#define Write_Data_to_Buffer2 0x87
//Read page to buffer
#define Read_Page_to_Buffer1 0x53
#define Read_Page_to_Buffer2 0x55
//Write buffer to page
#define Write_Buffer1_to_Page_whin_Erase 0x83
#define Write_Buffer2_to_Page_whin_Erase 0x86
//Continuous Array Read
//Page to Buffer Compare
#define Page_to_Buffer1_Compare 0x60
#define Page_to_Buffer2_Compare 0x61
#endif |
|