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.

[参考译文] CCS/MSP430FR4133:将 MSP430FR4133与 rc520连接时、SPI 读取零

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/885260/ccs-msp430fr4133-spi-read-alaways-zero-when-connect-msp430fr4133-with-rc520

器件型号:MSP430FR4133

工具/软件:Code Composer Studio

我尝试使用以下代码与 rc520 SPI 外设通信、但在读取 SPI 此处时、我的代码始终为零(我正在使用库、但我只提供我使用的代码):-

#include


#define RC522EN BIT3 //引脚8.3是使能引脚
#define RC522CS BIT0 //引脚4.0是 RESET 引脚

#define RC522READ 0x80 //为读取操作设置位7
#define RC522WRITE 0x7E //位7未设置为写入操作

//Page 1:命令
#define Reserved10 0x10
#define ModeReg 0x11
#define TxModeReg 0x12
#define RxModeReg 0x13
#define TxControlReg 0x14
#define TxAutoReg 0x15
#define TxSelReg 0x16
#define RxSelReg 0x17
#define RxThresholdReg 0x18
#define DemodReg 0x19
#define Reserved11 0x1A
#define Reserved12 0x1B
#define MifareReg 0x1C
#define Reserved13 0x1D
#define Reserved14 0x1E
#define SerialSpeedReg 0x1F


内联 void readRC522 (unsigned char addr、unsigned char *value){
//读取寄存器的值
 spitxrx (RC522CS、((addr << 1)& RC522WRITE)| RC522READ、值、1、0);
返回;


unsigned char verifyRC522 (unsigned char addr、unsigned char data、unsigned char mask){


unsigned char regval=0;
readRC522 (addr、regval);//始终 regval 为零??????
if ((data&mask)==(regval&mask))返回1;//数据匹配

//错误
返回0;

内联 void writeRC522 (unsigned char addr、unsigned char value){
//将特定寄存器设置为值
spitxx (RC522CS、(addr<<1)&RC522WRITE、Value);
返回;

void spitxx (int enpin、unsigned char addr、unsigned char data){

P4OUT &=~Ω 引脚;//将 CS 设置为低电平以选择芯片
_DELAY_CYCLES (1000);//等待1毫秒启动

while (UCB0STATW 和 UCBUSY);//确保总线未被使用
UCB0TXBUF=addr;
while (!(UCB0IFG & UCTXIFG));//等待 TX bufer 中的聊天室
UCB0TXBUF=数据;
while (UCB0STATW 和 UCBUSY);//等待通信完成
P4OUT |= ENPIN;//将 CS 设置为高电平以取消选择芯片
_DELAY_CYCLES (1000);//等待1毫秒启动
返回;

空 NSSHigh_Low (空)

P8OUT &=~RC522EN;
_DELAY_CYCLES (50000);//等待50毫秒以实现完全开启关断
P8OUT |= RC522EN;
_DELAY_CYCLES (50000);//等待50毫秒以启动//退出断电模式。 这将触发硬复位。
//数据 表中的第8.8.2节说明振荡器启动时间是晶体的启动时间

空 initClockTo16MHz()

//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;

_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7);//首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_5;//设置 DCO = 16MHz
CSCTL2 = FLLD_0 + 487;//设置为 fDCOCLKDIV =(FLLN + 1)*(fFLLREFCLK/n)
//=(487 + 1)*(32.768 kHz/1)
//= 16MHz

_DELAY_CYCLES (3);
_BIC_SR_register (SCG0);//启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定

int main (void){


WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

P4DIR = BIT0;
P4OUT = BIT0;
P4SEL0 = 0;
P4REN = 0;

P5DIR = 0;
P5OUT = 0;
P5SEL0 = BIT0 + BIT1 + BIT2 + BIT3;
P5REN = 0;

P6DIR = 0;
P6OUT = 0;
P6SEL0 = 0;
P6REN = 0;

P7DIR = BIT4 | BIT5;
P7OUT = 0;
P7SEL0 = 0;
P7REN = 0;

P8DIR = BIT3;
P8OUT = BIT0;
P8SEL0 = 0;
P8REN = 0;

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

 

////////////////////////// SPI 初始化
UCB0CTLW0 = UCSWRST;//**将状态机置于复位状态**
UCB0CTLW0 |= UCMST + UCSYNC + UCCKPL + UCMSB;// 3引脚8位 SPI 主 MSB
UCB0CTLW0 |= UCSSEL_2;// SMCLK
UCB0BR0 |= 4;// CLK / 1
UCB0BR1 = 0;
UCB0CTL1 &=~UCSWRST;

//将 RESET 置为高电平并等待芯片唤醒:
NSSHigh_Low ();

writeRC522 (TModeReg、0x8D);//Tauto=1、f (timer)=6.78 MHz/TPrescaler 为8D
writeRC522 (TPrescalerReg、0x3E);//was 3E
writeRC522 (TReloadRegL、1);//was dec30
writeRC522 (TReloadRegH、30);//was 0
writeRC522 (TxAutoReg、0x40);
writeRC522 (ModeReg、0x3D);
writeRC522 (RFCfgReg、regvar[RFCfgRer][0]);//最大功率
writeRC522 (CommandReg、PCD_IDLE);
writeRC522 (FIFOLevelReg、BIT7);//清空 FIFO

if (!verifyRC522 (TModeReg、TModeReg、0x8D){

//错误的 rrrrrrrrrrrrrrrrrrr

任何支持都将得到执行

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

    1) spitxrx()是您的问题的中心,但我看不到它在任何地方定义

    2) 2)这种情况

    > if (!verifyRC522 (TModeReg、TModeReg、0x8D)

    看起来不正确。 您可以将 TModeReg 设置为上面的0x8D、因此我认为它现在看起来不会像0x2A。 也许(?) 您需要的内容如下:

    > if (!verifyRC522 (TModeReg、0x8D、0xFF)

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

    感谢您对要点的回答:

    1 -

    void spitxrx (int enpin、unsigned char addr、unsigned char *数据、unsigned int len、unsigned char inc){

    unsigned int i=0;

    unsigned char workingaddr=addr、dummy;

    P4OUT &=~Ω 引脚;//将 CS 设置为低电平以选择芯片

    _DELAY_CYCLES (1000); //等待50毫秒启动

    while (UCB0STATW 和 UCBUSY);//确保总线未被使用

    //dummy=UCB0RXBUF;//清除 rxREADY 标志

    UCB0TXBUF=addr;

    while (!(UCB0IFG & UCRXIFG));//等待字节被接收

    DATA[0]=UCB0RXBUF;

    while (len-i){

    workingaddr += inc;

    UCB0TXBUF=工作地址;

    while (!(UCB0IFG & UCRXIFG));//等待字节被接收

    DATA[I]=UCB0RXBUF;

    i++;

    P4OUT |= ENPIN;//将 CS 设置为高电平以取消选择芯片

    _DELAY_CYCLES (1000); //等待50毫秒启动

    虚拟++;

    返回;

    2 -我认为这里的错误是、当我从 SPI 读取时、我总是读取零、即使这样 、我也会尝试将结果反馈给您。

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

    您是否相当确定 RC522处于 SPI 模式? I2C 和 EA 引脚是如何布线的? [参考 MFRC522数据表 R3.9、表5]

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

    嗯、我想知道你为什么这么说。 我有 rc520、我认为它没有 i2c、但从您的角度来看、您是否认为上述代码将起作用、并且没有逻辑错误? 此外、我还想问是否有任何工具可以知道 SPI 工作正常? (注意:我没有逻辑分析仪或示波器)

    感谢您的努力、感谢您的帮助。

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

    我一直在查看该器件。 我没有发现"rc520"有任何明显的命中、并且在函数中似乎存在一些重叠。

    https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf

    您能否发布完整的器件型号? (还是更好的、还是数据表链接?)

    我没有看到您的代码有任何明显的错误、所以我在外面看。

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

    这里是数据表、我认为它与522相同、但522具有 I2C

    chinaidcard.com/.../20170728182043_7212.pdf

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

    根据 CV520数据表第8.1.1节和图13、我认为您需要 UCCKPL=0和 UCCKPH=1。

    此外,当我通过格式化板运行代码时[Hint: Use Code Tags --带有“ ”我注意到:

    >//dummy=UCB0RXBUF ;//清除 rxREADY 标志

    在这种情况下、我认为这一行对于避免读取陈旧数据非常重要。 实际上、我建议您将这一行放在 spitxx 的末尾、这样您就可以始终与 IFG 同步退出。 是否有理由删除此行?

    --------

    在没有示波器的情况下调试 SPI 可能比较复杂。 一些一般性建议:

    1) 1)尝试读取一些复位时具有非零值的寄存器。 这将有助于区分是读取还是写入失败。 复位后、它看起来(例如) ModGsPReg (0x29)为0x20。

    2) 2)尝试一次读取几个寄存器。 这将有助于显示一个逐1错误。

    3) 3)尝试降低 SPI 时钟速度。 可能从10kHz 开始工作。 较慢的 SPI 时钟更容易让人产生从属的奇怪现象、连接松动、导线长以及有问题的焊点。

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

    首先,此问题未解决,我错误地单击“Resolved (已解决)”按钮。

    关于 UCCKPH=1、我尝试过但没有区别。

    有关虚拟标志和 SPI 的建议、我将尝试您的建议并反馈给您结果。

    感谢您的努力Heart️。

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

    我尝试了我们同意的操作、但也尝试了读取 SPI 寄存器中的零值。

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

     您从 ModGsPReg 获得了什么?

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

    不幸的是、始终为零

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

    当我在 NSS 引脚"P8OUT |= RC522EN"上输出时、我还想问您其他问题、我发现电压为1.25伏。 rc520是否知道这一点并启用 rc520的功能?

    我在数据表中看到、NSS 必须是一个才能工作并启用 rc520 IC、并且 NRSTPD 在通过 SPI 发送数据时必须为低电平、在发送数据后、它将再次像片选一样为高电平。 对吧?

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

    >P8DIR = BIT3;
    >P8OUT = BIT0;

    这看起来有点不寻常。 如果其中一个是 NSS 和另一个 NRSTPD、您可能希望将两者都设置为高电平并同时设置为两个输出。 我想这可能是您的1.25V 电压的来源。

    正如我在数据表中看到的那样,引脚的用法正好相反-- NRSTPD (“非 RST”)被用来复位器件,而 NSS (“非从器件选择”)是 SPI 芯片选择。  

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

    谢谢您问题现已解决、我使其与其他问题相反。

    现在工作正常、谢谢