SCK (CPOL = 0)情况的模拟:特别说明,这里的时钟线、片选信号线加了反向器;MOSI、MISO线正常
这里只是模拟,对应到实际的操作,应该看从SPI器件可以访问的存储空间的范围以及对应的读写权限。
/////////////////////////////////////////////////////////////////////
//功 能:读RC632寄存器
//参数说明:Address[IN]:寄存器地址
//返 回:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr;
unsigned char ucResult=0;
MF522_NSS = 1; //******不知道是否需要?
ucAddr = ((Address<<1)&0x7E)|0x80; //地址最高位置1,接下来6位为正常地址,最后一位0
MF522_MOSI = ((ucAddr&0x80)==0x80); // 将地址送SI数据线,下降沿接收地址
MF522_SCK = 1;//0;
nop();
ucAddr <<= 1;
for(i=8;i>0;i--)
{
MF522_SCK = 0;//1;
nop();
if(i==1)
{
MF522_MOSI = 1; // 将地址送SI数据线,下降沿接收地址
}
else
MF522_MOSI = ((ucAddr&0x80)==0x80); // 将地址送SI数据线,下降沿接收地址
MF522_SCK = 1;//0;
nop();
ucAddr <<= 1;
}
MF522_NSS = 0; //对于单主单从的可以不需要该信号
nop();
MF522_SCK = 1;//0;
nop();
MF522_NSS = 1; //对于单主单从的可以不需要该信号
nop();
for(i=8;i>0;i--) //上升沿 从SO数据线发送数据
{
ucResult <<= 1;
ucResult|=MF522_MISO; //去掉了强制类型转换bit
MF522_SCK = 0;//1;
nop();
MF522_SCK = 1;//0;
nop();
}
MF522_NSS = 0; //对于单主单从的可以不需要该信号
nop();
return ucResult;
}
/////////////////////////////////////////////////////////////////////
//功 能:写RC632寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr;
MF522_NSS = 1; //******不知道是否需要?
ucAddr = ((Address<<1)&0x7E);
MF522_MOSI = ((ucAddr&0x80)==0x80); // 将地址送SI数据线,下降沿接收地址
MF522_SCK = 1;//0;
nop();
ucAddr <<= 1;
for(i=8;i>0;i--)
{
MF522_SCK = 0;//1;
nop();
if(i==1)
{
MF522_MOSI = 1; // 将地址送SI数据线,下降沿接收地址
}
else
MF522_MOSI = ((ucAddr&0x80)==0x80); // 将地址送SI数据线,下降沿接收地址
MF522_SCK = 1;//0;
nop();
ucAddr <<= 1;
}
MF522_NSS = 0; //对于单主单从的可以不需要该信号
nop();
MF522_NSS = 1; //对于单主单从的可以不需要该信号
MF522_MOSI = ((value&0x80)==0x80);
MF522_SCK = 1;//0;
nop();
value <<= 1;
for(i=8;i>0;i--)
{
MF522_SCK = 0;//1;
nop();
if(i==1)
MF522_MOSI = 1; // 将地址送SI数据线,下降沿接收地址
else
MF522_MOSI = ((value&0x80)==0x80); // 将地址送SI数据线,下降沿接收地址
MF522_SCK = 1;//0;
nop();
value <<= 1;
}
MF522_NSS = 0; //对于单主单从的可以不需要该信号
nop();
}