本人新人一枚。再次请求大虾援助。帮我分析一下问题在哪。
LZ找个一个demo 网上的demo估计都差不多。
使用的是MSP430F5438A,使用硬件SPI的方式,与RC522通讯 ,测试的过程中发现,正常的寻卡方冲突选卡都OK ,卡校验和写块不是很稳定,有时候连续12块校验写块都能通过,有时候却只能写1块。经过LZ的仔细检查时序,也没发现什么问题,也可能我还没有发现。但是发现失败后读ErrorFlag的值是0x01,初步怀疑校验和写块都是写了很多个字节到FIFO后,写入的字节数和RC522接收到的字节数不等。
下面贴一下时序图和代码:
顺序是CS,SCK,SIMO,SOMI,SCK硬件生成 =0.25M =单片机外部8M/32分频。
下面贴上代码:
//功能:使用SPI发送一个字节,硬件spi写
//输入参数: sData=发送的字节
//输出参数: 无
void SPI_Write(unsigned char sData)//功能:使用SPI发送一个字节
{
unsigned char val;
// while (!(UCB3IFG & UCTXIFG)); //发送缓冲器已经准备好
UCB3TXBUF = sData;
while (!(UCB3IFG&UCRXIFG)); // 发送完成?(MSP430)的收发是同时进行的。
val =UCB3RXBUF; // 清空接收缓冲,因为这次收到的数据没有意义
}
//功能:使用SPI接收一个字节,硬件spi读
//输入参数: 无
//输出参数: 接收的字节
unsigned char SPI_Read(void)//功能:使用SPI接收一个字节
{
unsigned char val;
// while (!(UCB3IFG & UCTXIFG)); //发送缓冲器已经准备好
UCB3TXBUF = 0x00;
while (!(UCB3IFG&UCRXIFG)); // 发送完成?(MSP430)的收发是同时进行的。
val =UCB3RXBUF; // 清空接收缓冲,因为这次收到的数据没有意义
return val;
}
/////////////////////////////////////////////////////////////////////
//功 能:读RC522寄存器
//参数说明:Address[IN]:寄存器地址
//返 回:读出的值
//注意点:1/片选信号低电平有效,
//2/手册7.2.2节中,MOSI发送地址0时MISO读出的不算,MOSI发送地址1时,MISO读出的是地址0的数据
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char ucAddr;
unsigned char ucResult=0;
SS_LOW;
ucAddr = ((Address<<1)&0x7E)|0x80;//变化成有效的地址形式,最低位为0,最高位为1时候是,从MFRC522读出数据,参考39页
SPI_Write(ucAddr);//spi发送地址
ucResult=SPI_Read();//spi读取数据
SS_HIGH;
return ucResult;
}
/////////////////////////////////////////////////////////////////////
//功 能:写RC522寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
//注意点:片选信号低电平有效
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char ucAddr;
SS_LOW;
ucAddr = ((Address<<1)&0x7E);//变化成有效的地址形式,最低为为0,最高位为1时候是,写入MFRC522数据
SPI_Write(ucAddr);
SPI_Write(value);
SS_HIGH;
}
|