主题中讨论的其他器件:CC3235SF
尊敬的 TI:
我想通过与 CC3232sf (主器件)的 i2c 通信建立 PN532 RFID (从器件)的固件版本、但我尝试过很多次、但失败了、因此请检查代码并解决此问题。
uint32_t getFirmwareVersion (void)
{
uint32_t 响应;
pn532_packetbuffer[0]= PN532_COMMAND_GETIRMWAREVSION;
if (!sendCommandCheckAck (pn532_packetbuffer、1、1000))
{
返回0;
}
//读取数据包
ReadData (pn532_packetbuffer、12);
//检查一些基本的东西
如果(0!= memcmp ((char*) pn532_packetbuffer、
(char*) pn532RESPONSE_firmwarevers、6))
{
返回0;
}
int offset = 6;
响应= pn532_packetbuffer[offset++;
响应<<= 8;
响应|= pn532_packetbuffer[offset++];
响应<<= 8;
响应|= pn532_packetbuffer[offset++];
响应<<= 8;
响应|= pn532_packetbuffer[offset++];
退货响应;
}
bool sendCommandCheckAck (uint8_t *cmd、uint8_t cmdlen、uint16_t 超时)
{
//编写命令
writecommand(cmd, cmdlen);
//等待芯片准备就绪!
如果(!waitready (timeout))
{
返回 false;
}
//读取确认
如果(!readack())
{
#ifdef PN532DEBUG
printf ("未接收到 ACK 帧!\n\n"\});
#endif
返回 false;
}
//对于 SPI,只等待芯片再次就绪。
// I2C 不需要这样做。
如果(!waitready (timeout))
{
返回 false;
}
返回 true;// ack'd 命令
}
/ /
/*!
n ü@brief 会将命令写入 PN532、并自动插入
前导码和所需的帧详细信息(校验和、len 等)
@param cmd 指向命令缓冲区的指针
@param cmdlen 命令长度(以字节为单位)
*
/ /
void writecommand (uint8_t *命令、uint8_t 命令)
{
// I2C 命令写入。
uint8_t 校验和;
uint8_t txBuffer[9];
uint8_t rxBuffer[0];
cmdlen++;
usleep(2000);
#ifdef PN532DEBUG
display_printf (display、0、0、"\n 正在结束:");
#endif
// I2C 启动
i2cTransaction.slaveAddress = PN532_I2C_ADDRESS;
校验和= PN532_PREAMBLE + PN532_PREAMBLE + PN532_STARTCODE2;
txBuffer[0]= PN532_PREAMBLE;// 0x00
txBuffer[1]= PN532_PREAMBLE;// 0x00
txBuffer[2]= PN532_STARTCODE2;// 0xFF
txBuffer[3]= cmdlen;
txBuffer[4]=~cmdlen + 1;
txBuffer[5]= PN532_HOSTTOPN532;// 0xD4
校验和+= PN532_HOSTTOPN532;
uint8_t i = 0;
对于(i = 0;i < cmdlen - 1;i++)
{
txBuffer[6]=(cmd[i]);
// i2cTransaction.writeBuf =&cmd[i];
// i2cTransaction.readBuf = rxBuffer;
// i2cTransaction.writeCount = strlen ((const char*) txBuffer);
// i2cTransaction.ReadCount = 0;
// I2C_transfer (i2c、&i2cTransaction);
校验和+= cmd[i];
#ifdef PN532DEBUG
Display_printf (display、0、0、"0x");
display_printf (display、0、0、"%x"、(byte) cmd[i]);
#endif
}
txBuffer[7]=~校验和;
// i2cTransaction.writeBuf =&txBuffer[7];
// i2cTransaction.readBuf = rxBuffer;
// i2cTransaction.writeCount = strlen ((const char*) txBuffer);
// i2cTransaction.ReadCount = 0;
// I2C_transfer (i2c、&i2cTransaction);
txBuffer[8]= PN532_POSTACMBLE;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.writeCount = 9;
i2cTransaction.ReadCount = 0;
I2C_transfer (i2c、&i2cTransaction);
// I2C 停止
I2C_Close (i2c);
/ /
/*!
@如果 PN532已准备好响应、则短暂返回 true。
*
/ /
bool isready()
{
uint8_t x;
x = GPIO_READ (IRQ_PIN);
如果(x=0)
{
返回1;
}否则{
返回0;
}
}
/*!
@短暂等待 PN532就绪。
@放弃前超时超时
*
/ /
bool waitready (uint16_t 超时)
{
uint16_t 定时器= 0;
while (!isready())
{
如果(超时!= 0)
{
计时器+= 10;
如果(定时器>超时)
{
display_printf (display、0、0、"waitready timeout!\n\r\n);
返回 false;
}
}
}
返回 true;
}
/*!
μ@简要尝试读取 SPI 或 I2C ACK 信号
*
/ /
bool readack()
{
uint8_t ackbuy[6];
ReadData (ackbuff、6);
return (0 =memcmp ((char*) ackbuff、(char*) pn532ack、6));
}
/ /
/*!
@简要通过 I2C 从 PN532读取 n 个字节的数据。
@param buff 指针指向将要写入数据的缓冲区
@param n 要读取的字节数
*
/ /
空 ReadData (uint8_t *缓冲区、uint8_t n)
{
i2cTransaction.slaveAddress = PN532_I2C_ADDRESS;
i2cTransaction.writeBuf =NULL;
i2cTransaction.readBuf =缓冲;
i2cTransaction.writeCount = 0;
i2cTransaction.ReadCount = n+2;
I2C_transfer (i2c、&i2cTransaction);
uint8_t i = 0;
对于(i = 0;i < n-1;i++)
{
buff [i]= buff [i+1];
}
}