单片机向SIM卡发送读写命令的困难

zycxy 2012-05-22 03:44:39
最近在做一个用nf无线soc单片机读写SIM卡的程序。用的编译环境是KEIL4。现在的进展遇到了一些困境,找不到解决的思路,所以寻求高手帮助。
我目前程序的进展如下:
我用一个板子的I/O为SIM卡提供外部时钟,时钟频率经过示波器测试约为1.45M
用另一个板子实现对SIM卡的处理操作。
当前已经实现了对SIM卡的冷复位和热复位。复位后的信息如下:
0x3b 0x9f 0x94 0x80 0x1f 0xc2 0x80 0x31 0xa0 0x73 0xbe 0x21 0x00 0x63 0x55 0x01 0x41 0x83 0x14 0x90 0x00 0xda
复位后应该就可以直接向SIM卡发送命令了。我通过以下函数向SIM卡发命令:
void write_SIM_byte(uint8_t send_data)
{
uint8_t loop;
bit parity_bit;
P0DIR &=0xfb; // 将SIM_IO状态改为输出
SIM_IO=0; // 发送起始位
delay_us(ETU); // 延时1个ETU
for(loop=0;loop<8;loop++) // 写入1字节数据
{
if(send_data&0x01) // 写数据位
SIM_IO=1;
else
SIM_IO=0;
parity_bit ^=send_data&0x01; // 计算奇偶检验位
send_data >>=1;
delay_us(ETU); // 延时1ETU等待接收下一字节数据
}
SIM_IO=parity_bit; // 写奇偶检验位
delay_us(ETU);
SIM_IO=1;
delay_us(ETU);
P0DIR |=0x04; // 将SIM_IO状态改为输入
}


void SIM_Read(void) // 发送select命令
{
write_SIM_byte(0xa0);
delay_us(2*ETU);
write_SIM_byte(0xa4);
delay_us(2*ETU);
write_SIM_byte(0x00);
delay_us(2*ETU);
write_SIM_byte(0x00);
delay_us(2*ETU);
write_SIM_byte(0x02);
delay_us(2*ETU);

}

可是无论我是通过示波器观察,还是在发完命令后直接用函数读都只得到了一个很有争执返回信息“0xff”。
通过冷复位返回的数据得到卡片的Fi=512,Di=8。而默认的Fd=372,Dd=1。我上述的程序中用的ETU是按照Fd,Dd的值以及f算出来的,难道在复位完成之后就要按照这个ETU执行了嘛?跪求解答啊!!!
...全文
211 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧