我用stm8的IO口模拟SPI通信,RC522读写寄存器函数如下:
往RC522寄存器里写数据,读出来的却与写进去的不相同。天线有13.56Mhz射频输出,请问这样的程序能否模拟SPI的通信。这里人气旺,希望能得到指点。感谢!!
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true]//功 能:写RC632寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr;
GPIO_WriteLow(GPIOD, MF522_SCK); //时钟
GPIO_WriteLow(GPIOA,MF522_NSS); //片选
ucAddr = ((Address<<1)&0x7E);
for(i=8;i>0;i--)
{
if((ucAddr&0x80)==0x80)
{
GPIO_WriteHigh(GPIOC,MF522_SI); //主机输出 从机输入 [/mw_shl_code]
[mw_shl_code=c,true] }
else
{
GPIO_WriteLow(GPIOC,MF522_SI);
}
GPIO_WriteHigh(GPIOD,MF522_SCK);
ucAddr <<=1;
GPIO_WriteLow(GPIOD,MF522_SCK);
}
for(i=8;i>0;i--)
{
if((value&0x80)==0x80)
{
GPIO_WriteHigh(GPIOC, MF522_SI);
}
else
{
GPIO_WriteLow(GPIOC, MF522_SI);
}
nop();
nop();
GPIO_WriteHigh(GPIOD, MF522_SCK);
value <<=1;
GPIO_WriteLow(GPIOD, MF522_SCK);
}
GPIO_WriteHigh(GPIOA,MF522_NSS);
GPIO_WriteHigh(GPIOD,MF522_SCK );
}
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr;
unsigned char ucResult=0;
GPIO_WriteLow(GPIOD,MF522_SCK ); //时钟
GPIO_WriteLow(GPIOA,MF522_NSS); //片选
ucAddr = ((Address<<1)&0x7E)|0x80;
for(i=8;i>0;i--)
{
if((ucAddr&0x80)==0x80)
{
GPIO_WriteHigh(GPIOC,MF522_SI ); //主机输出,从机输入
}
else
{
GPIO_WriteLow(GPIOC, MF522_SI); //主机输出,从机输入
}
GPIO_WriteHigh(GPIOD,MF522_SCK );
ucAddr <<= 1;
GPIO_WriteLow(GPIOD, MF522_SCK);
}
for(i=8;i>0;i--)
{
GPIO_WriteHigh(GPIOD,MF522_SCK );
ucResult <<= 1;
ucResult|= (BitStatus)(GPIO_ReadInputPin(GPIOC, MF522_SO));
GPIO_WriteLow(GPIOD, MF522_SCK);
}
GPIO_WriteHigh(GPIOA,MF522_NSS);
GPIO_WriteHigh(GPIOD,MF522_SCK );
return ucResult;
}[/mw_shl_code]
|