⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 AT45DB041 LPC2138驱动程序
💻 C
字号:
#include  "config.h" 

#define BUFFER_1_WRITE 0x84			// buffer1写指令代码
#define B1_TO_MM_PAGE_NO_ERA 0x88	// 无在线擦除的buffer1写主内存页指令代码
#define MM_PAGE_READ 0xD2			// 主内存页读指令代码
#define STAT_REG_READ 0xD7			// 状态寄存器读指令代码
#define PAGE_ERASE 0x81

unsigned char buf_start_addr;		// buffer中起始字节地址,16位中低11位为有效位
unsigned char data_in[8];		    // 要写入IC卡的数据
unsigned char data_out[8];	        // 要从IC卡中读出的数据

#define   AT_CS 1<<7                   // P0.7口为45DB041的片选

/********************************************************************************************************
** 函数名称:DelayNS()
** 函数功能:长软件延时
** 入口参数:dly
** 出口参数:无
********************************************************************************************************/

void  DelayNS(uint32  dly)
{  
    uint32  i;

    for(; dly>0; dly--) 
        for(i=0; i<50000; i++);
}

/********************************************************************************************************
** 函数名称:SendData(unsigned char data)
** 函数功能:向SPI总线发送数据(8位)
** 入口参数:data   待发送的数据
** 出口参数:无
********************************************************************************************************/

void  SendData(unsigned char data)
{  
    IOCLR = AT_CS;
   
    SPDR = data;
    while( 0 == (SPSR & 0x80));	       // 等待数据发送完毕
    
    IO0SET = AT_CS;
}

/********************************************************************************************************
** 函数名称:IcStatus()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/

unsigned char IcStatus()
{
    IO0CLR = AT_CS;
    
	SendData(STAT_REG_READ);			// 写入读IC卡芯片状态指令
	SendData(0x00) ;			        // 写入8位无关位以确保时间上完成数据的读出
	
	IO0SET = AT_CS;
    
    return SPDR;						// 返回IC卡芯片状态字节
}

/********************************************************************************************************
** 函数名称SendDataToIc(unsigned char line_addr, uint16 page_addr , unsigned char data)
** 函数功能:写芯片函数
** 入口参数:line_addr:X地址  page_addr:Y地址 data:数据
** 出口参数:无
*********************************************************************************************************/

void SendDataToIc(unsigned char line_addr, uint16 page_addr , unsigned char data)
{
	IO0CLR = AT_CS;
	
	while ((IcStatus()&0x80)==0x00);            // 芯片忙等待
     	
   	SendData(BUFFER_1_WRITE);			        // buffer1写指令代码
   	SendData(0x00);	
	SendData(0x00);                             // 时序要求的无关16位
	SendData(line_addr);
    
	SendData(data);                   	        // 写入数据
	
    while ((IcStatus()&0x80)==0x00);            // 芯片忙等待,芯片不忙时,才能接收下一条指令
    
    SendData(B1_TO_MM_PAGE_NO_ERA);	            // 写入无在线擦除的buffer1写主内存页指令代码。
	SendData((unsigned char)(page_addr>>8));	// 写入5位保留位加上11位页地址的高3位
	SendData((unsigned char)page_addr);         // 写入11位页地址的低8位
	SendData(0x00);                   	        // 再写入8位无关位 
	       
    IO0SET = AT_CS;  
}

/********************************************************************************************************
** 函数名称:ReadDataFormIc(unsigned char line_addr, uint16 page_addr , unsigned char data)
** 函数功能:读芯片函数
** 入口参数:line_addr:X地址  page_addr:Y地址 data:数据
** 出口参数:data 既要读出的数据
*********************************************************************************************************/

unsigned char ReadDataFormIc(unsigned char line_addr, uint16 page_addr , unsigned char data)
{
	uint8 i;
		
	IO0CLR = AT_CS;
    while ((IcStatus()&0x80)==0x00);
    
	SendData(MM_PAGE_READ) ;		               // 写入主内存页读指令代码
	SendData((unsigned char)(page_addr>>8));	   // 写入5位保留位加上11位页地址的高3位
	SendData((unsigned char)page_addr);           // 写入11位页地址的低8位
	SendData(line_addr);                           // 写入8位页起始地址位
	
	for(i=0; i<4; i++)
		SendData(0x00);                            // 32位无关位
		
	SendData(0xff) ;			                   // 写入8位无关位以确保时间上完成数据的读出
		
	IO0SET = AT_CS;
	
	return SPDR;
}

/********************************************************************************************************
** 函数名称:PageErase(uint16 page_addr)
** 函数功能:页檫除函数
** 入口参数:page_addr:页地址
** 出口参数:无
*********************************************************************************************************/

void PageErase(uint16 page_addr)
{	
	IO0CLR = AT_CS;
    while ((IcStatus()&0x80)==0x00);
    
	SendData(PAGE_ERASE);		                   // 写入页檫除指令代码
	SendData((unsigned char)(page_addr>>8));	   // 写入5位保留位加上11位页地址的高3位
	SendData((unsigned char)page_addr);            // 写入11位页地址的低8位
	
	SendData(0x00);                                // 8位无关位
	
	IO0SET = AT_CS;
}

/********************************************************************************************************
** 函数名称:ChipErase()
** 函数功能:芯片全部檫除函数
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/

void ChipErase()
{	
	IO0CLR = AT_CS;
	
    while ((IcStatus()&0x80)==0x00);
    SendData(0xC7);
    
	while ((IcStatus()&0x80)==0x00);
    SendData(0x94);
    
    while ((IcStatus()&0x80)==0x00);
    SendData(0x80);
    
    while ((IcStatus()&0x80)==0x00);
    SendData(0x9A);
    
	IO0SET = AT_CS;
}

/********************************************************************************************************
** 函数名称:SPIInit()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/

void  SPIInit()
{
	PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8);            // 设置SPI端口
	IODIR = AT_CS;
    SPCCR = 0x52;		                                           // 设置SPI时钟分频
 	SPCR  = (0 << 3) |				                               // CPHA = 0, 数据在SCK 的第一个时钟沿采样
 			(1 << 4) |				                               // CPOL = 1, SCK 为低有效
 			(1 << 5) |				                               // MSTR = 1, SPI 处于主模式
 			(0 << 6) |				                               // LSBF = 0, SPI 数据传输MSB (位7)在先
 			(0 << 7);				                               // SPIE = 0, SPI 中断被禁止
}

/********************************************************************************************************
** 函数名称:main()
** 函数功能:方便程序调试
********************************************************************************************************/

int main (void)
{  
	SPIInit();
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -