很久没写文档了,倒不是因为懒,是因为太忙了,但今天晚上因为一个小问题阻滞了脚步,而且这个小问题完全是因为自己的不细心,所以很有必要写出来作为警戒。以后一定要注意!!
这是读卡模块RC522的时序图以及数据格式,如下图所示:
这是写的读数据的函数
void RC522_RD_data(uchar addr, uchar *p_data, uchar tick)
{
uchar i;
uchar j;
uchar result = 0;
addr <<= 1;
addr |=0x80; //RC522 地址字节格式(读操作)
CLR_RC522_CLK;
CLR_RC522_CS;
RC522_send_addr(addr);
for (j=0; j<tick; j++){
if (j ==(tick-1)){
addr = 0;
}
for (i=0;i<8; i++){
result <<= 1;
if(RC522_DIN_SET){
result++;
}
if ((addr&0x80) == 0x80){
SET_RC522_DOUT;
}else{
CLR_RC522_DOUT;
}
_NOP();
_NOP(); //50ns minimum in clk low
addr<<=1;
SET_RC522_CLK;
_NOP();
_NOP();//50ns minimum
CLR_RC522_CLK;
_NOP();
_NOP();
}
*p_data++ =result;
}
SET_RC522_CS;
}
这里的地址addr执行两次之后就已经变成0了,所以再次读取所在地址的数据的时候,读取的实际上是0x00单元的数据,所以、、、
这样的小问题确实不容易发现,所以在写程序的时候一定要注意避免。