This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
大家好、我想与 mfrc522通信。 我在 SPI 方面有问题。 自行控制 CS 引脚。 我连接了 GPIO。 我把我的连接留在下面。 您能检查我的软件是否有问题吗?
unsigned char MFRC522_SPIreceive (unsigned char address_rcv)
{
SPI_RECEIVE_ADDRESS =(((address_rcv << 1)& 0x7E)| 0x80);// Okuma işlemi için adres
MFRC_NSS_OFF;
DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_RECEIVE_ADDRESS);
while (DL_SPI_isBusy (SPI_0_INST))
;
DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、dummy);
while (DL_SPI_isBusy (SPI_0_INST))
;
SPI_RECEIVED_DATA = DL_SPI_receiveData8 (SPI_0_INST);
MFRC_NSS_ON;
返回 SPI_RECEIVED_DATA;
}
void MFRC522_SPIsend (unsigned char address_snd、unsigned char data_snd)
{
SPI_SEND_ADDRESS =((ADDRESS_SND << 1)且0x7E);// Yazma işlemi için adres
SPI_SEND_DATA = DATA_snd;
MFRC_NSS_OFF;
DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_SEND_ADDRESS);
while (DL_SPI_isBusy (SPI_0_INST))
;
DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_SEND_DATA);
while (DL_SPI_isBusy (SPI_0_INST))
;
MFRC_NSS_ON;
}
如何判断 SPI 存在问题?
1)对于 SPI、每个传输字节都会与一个接收字节匹配、无论您是否对其感兴趣。 如果您对接收字节不感兴趣、则仍然需要读取该字节并将其丢弃。 在 SPIReceive()中、您将读取的字节将与第一个(地址)字节匹配、而不是第二个(响应)字节匹配、因此您应读取 两次并保留第二个字节。 同样,在 SPIsend ()中,你应该读取两次并丢弃两次,这样它们就不会 在你回来后留在 FIFO 中。
2) DL_SPI_setControllerCommandDataModeConfig ()调用的用途是什么? CS3是否连接到某个设备? 如果没有,它可能不会造成麻烦(我还没有尝试),但它可能是不必要的。
3) 3) MFRC522 "I2C"引脚连接到什么? 更普遍地说:您是否使用商业分线板?
我的产品使用 SPI。 我将 CS3引脚和其他设置保留在下面。 我还在另一个处理器上通过 SPI 进行通信、但在将其集成到德州处理器中时遇到困难。 我唯一要更改的区域是 SPI 通信发送和接收。
在调试部分、我看到它正在 SPI 忙状态下等待。
我建议您将"Frame Format"(帧格式)切换为"Motorola 3-Wire"(摩托罗拉3线)、因为这是您所使用的格式。 我在 TRM 中并没有看到太多关于 CSN 的信息、但如果使用4线制、那么许多 MCU 对 CS 信号很挑剔。
MFRC522上的 CS3引脚连接到了什么? 我怀疑你不想 CDMODE。
我没有连接 CS3。 仅对 SPI 使用 mfrc522
我关闭了清洁发展机制、但不管怎么想都不改变
unsigned char MFRC522_SPIreceive (unsigned char address_rcv)
{
SPI_RECEIVE_ADDRESS =(((address_rcv << 1)& 0x7E)| 0x80);// Okuma işlemi için adres
MFRC_NSS_OFF;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_RECEIVE_ADDRESS);
while (DL_SPI_isBusy (SPI_0_INST))
;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、dummy);
while (DL_SPI_isBusy (SPI_0_INST))
;
SPI_RECEIVED_DATA = DL_SPI_receiveData8 (SPI_0_INST);
MFRC_NSS_ON;
返回 SPI_RECEIVED_DATA;
}
void MFRC522_SPIsend (unsigned char address_snd、unsigned char data_snd)
{
SPI_SEND_ADDRESS =((ADDRESS_SND << 1)且0x7E);// Yazma işlemi için adres
SPI_SEND_DATA = DATA_snd;
MFRC_NSS_OFF;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_SEND_ADDRESS);
while (DL_SPI_isBusy (SPI_0_INST))
;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_SEND_DATA);
while (DL_SPI_isBusy (SPI_0_INST))
;
MFRC_NSS_ON;
}
其他 MCU 示例 ccode mfrc522
您现在的症状是什么? 您是否仍然卡在 SPI_isBusy 中?
a)您的 SPIreceive 函数将(仍然)返回一个不正确的字节(请参阅上面的(1))。
b) MFRC_NSS_OFF 是否将/CS 引脚设置为低电平?
c) 您可能不会等待 SPI_isBusy、而是先调用 SPI_receiveData8、而是 会尝试调用 DL_SPI_receiveDataBlocking8 ()、这将为您完成等待。
[编辑:更正了拼写错误]
a)我不明白
b)是的 、是低的
c)不要改变任何想法
unsigned char MFRC522_SPIreceive (unsigned char address_rcv)
{
SPI_RECEIVE_ADDRESS =(((address_rcv << 1)& 0x7E)| 0x80);// Okuma işlemi için adres
MFRC_NSS_OFF;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_RECEIVE_ADDRESS);
while (DL_SPI_isBusy (SPI_0_INST))
;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、dummy);
SPI_RECEIVED_DATA = DL_SPI_receiveDataBlocking8 (SPI_0_INST);
MFRC_NSS_ON;
返回 SPI_RECEIVED_DATA;
}
void MFRC522_SPIsend (unsigned char address_snd、unsigned char data_snd)
{
SPI_SEND_ADDRESS =((ADDRESS_SND << 1)且0x7E);// Yazma işlemi için adres
SPI_SEND_DATA = DATA_snd;
MFRC_NSS_OFF;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_SEND_ADDRESS);
while (DL_SPI_isBusy (SPI_0_INST))
;
// DL_SPI_setControllerCommandDataModeConfig (SPI_0_INST、1);// 1 Bayt komut gönderilecek
DL_SPI_transmitData8 (SPI_0_INST、SPI_SEND_DATA);
while (DL_SPI_isBusy (SPI_0_INST))
;
MFRC_NSS_ON;
}
这些函数的调用者看起来是什么样的? 如果这些函数被频繁调用、那么您的程序可能会花费(按比例)大量时间等待 SPI、从而导致它被卡住的错觉。
[请求:请使用"插入->代码"(位于编辑框的底部)发布代码片段。 大量未格式化的代码使您的帖子很难阅读。]
void MFRC522_init(void) { MFRC_RST= 1; MFRC522_SPIsend(CommandReg, CC_RESETPHASE); MFRC522_SPIsend(TModeReg, 0x8D); MFRC522_SPIsend(TPrescalerReg, 0x3E); MFRC522_SPIsend(TReloadRegL, 30); MFRC522_SPIsend(TReloadRegH, 0); MFRC522_SPIsend(TxASKReg, 0x40); MFRC522_SPIsend(ModeReg, 0x3D); Antenna_ON(); }
我单击时出错了、我向它发送了一个35us 的 SPI 数据、我将数据发送频率留在下面
此 pic。 其他 MCU 引脚霍尔传感器。 工作
此 pic。 德州 MCU 引脚霍尔传感器 不 工作
分析仪轨迹不会在事务中显示任何暂停的迹象。 哪个操作挂起?
时钟最初处于高电平这一事实有点令人不安、但最坏的情况是它仅影响第一个传输。 这可能是一个可分离的问题。
我几乎每秒发送一次该数据传输
如果您每秒(重复)发送此序列、听起来"SPI 挂起"症状已得到修复。 您现在的症状是什么?
或者、您看到的唯一失败是来自分析仪的这条消息吗? 它是否出现在每个事务序列中、还是仅出现在第一个事务中?
您使用的是什么(RC522)分线板? 我无法从您的照片中识别它。
我还得问:为什么您每秒重新初始化 RC522?