📄 main.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 + -