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.

[参考译文] LP-MSPM0G3507:MFRC522 SPI 错误

Guru**** 1785650 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1404415/lp-mspm0g3507-mfrc522-spi-error

器件型号:LP-MSPM0G3507

工具与软件:

大家好、我想与 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

    unsigned char MFRC522_SPIreceive (unsigned char address_rcv)
        SPI_RECEIVE_ADDRESS=(((address_rcv<<1)&0x7E)| 0x80)

      SPI_NSS= 0


        SPI_WRITE_TX (SPI0、SPI_RECEIVE_ADDRESS);
        while (SPI_IS_BUSY (SPI0));

      SPI_ClearRxFIFO (SPI0);

        SPI_WRITE_TX (SPI0、dummy);
        while (SPI_IS_BUSY (SPI0));

        SPI_RECEIVED_DATA = SPI_READ_RX (SPI0);

        SPI_NSS= 1

        返回 SPI_RECEIVED_DATA;
    }


    void MFRC522_SPIsend (unsigned char address_sndunsigned char data_snd)
        SPI_SEND_ADDRESS=((ADDRESS_SND<<1)&0x7E);
        SPI_SEND_DATA= data_snd

       SPI_NSS= 0

       SPI_WRITE_TX (SPI0、SPI_SEND_ADDRESS);

        while (SPI_IS_BUSY (SPI0));

        SPI_WRITE_TX (SPI0、SPI_SEND_DATA);

        while (SPI_IS_BUSY (SPI0));

        SPI_NSS= 1
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您现在的症状是什么? 您是否仍然卡在 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?