我从 iteadstudio.com 购买了一个 PN532 NFC 阅读器,并尝试通过 SPI 将其与 PIC18F4520 连接。
由于制造商没有可用的 C 驱动程序,我一直依赖这个基于 adafruit PN532 Arduino 驱动程序并适用于 ATMega 的驱动程序。
到目前为止,我只对驱动程序进行了 1 次更改。由于 PN532 首先需要数据 LSB,而 PIC 无法在硬件中处理此问题,因此我添加了以下行:
data = (data & 0xF0) >> 4 | (data & 0x0F) << 4;
data = (data & 0xCC) >> 2 | (data & 0x33) << 2;
data = (data & 0xAA) >> 1 | (data & 0x55) << 1;
在SPIwrite和 LSB 到 MSI readSPIdata函数中将 MSB 转换为 LSB。
但是,我在SAMConfig函数中不断收到错误,其中 pn532_packetArray[5] 不等于 0x15,因此不返回 1,并且在 pn532_packetArray[7] 始终等于 0的readPassiveTargetID函数中再次出现错误,尽管 NFC 标签是当下。如果我注释掉 pn532_packetArray[5],我可以从标签中读取某种形式的 ID,尽管我很确定它是不正确的。
所有其他校验和和sendCommandCheckAck函数都可以正常工作。我已经反复检查了我的代码与驱动程序。在这个阶段我正在拔头发,所以任何帮助或建议将不胜感激。
这是确切的代码:
unsigned char SAMConfig (void){
PN532DataArray[0] = 0x14; //commands taken from the datasheet
PN532DataArray[1] = 0x01;
PN532DataArray[2] = 0x14;
PN532DataArray[3] = 0x01;
if (!commandAndAck(PN532DataArray,4,1000))
return 0;
readSpiData(PN532DataArray, 8);
return(PN532DataArray[5]== 0x15 ? 1:0); //ALWAYS RETURNS 0!!
}
所以我认为问题一定出在 readSPIData 函数中:
void readSpiData (unsigned char* buffer, unsigned char n){
enable_slave;
delay_ms(2);
spiWrite(PN532_SPI_DATAREAD);//Send data read command
for(unsigned char i = 0; i < n; i++){
delay_ms(1);
buffer[i] = spiRead(); //buffer is incremented with read data
}
for(unsigned char i = 0; i < n; i++)
{
buffer[i] = (buffer[i] & 0xF0) >> 4 | (buffer[i] & 0x0F) << 4;//LSB => MSB
buffer[i] = (buffer[i] & 0xCC) >> 2 | (buffer[i] & 0x33) << 2;
buffer[i] = (buffer[i] & 0xAA) >> 1 | (buffer[i] & 0x55) << 1;
}
disable_slave;
}
SPI读取功能是基本的:
unsigned char spiRead (void){
sspbuf = 0; //send out rubbish data
while(!(sspstat.BF)); //waiting for BF(bit 0) to go to 1
return sspbuf; //return useful data byte
}
任何人都可以发现错误吗?