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.

[参考译文] BOOSTXL-DRV8323RS:BOOSTXL-DRV8323RS

Guru**** 2398695 points
Other Parts Discussed in Thread: BOOSTXL-DRV8323RS

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1427766/boostxl-drv8323rs-boostxl-drv8323rs

器件型号:BOOSTXL-DRV8323RS

工具与软件:

尊敬的社区:

我希望你们都做得很好。

我使用的是 STM32G431KBT6开发板、我需要配置 DRV8323RS 电机驱动器的寄存器。 对于该工程、我使用 BOOSTXL-DRV8323RS 开发板正确连接了 SPI 引脚、并将 SPI 时钟设置为1 MHz。 我在 Arduino IDE 中工作。

具体而言、我将尝试配置以下寄存器:

  • 0x02 (控制寄存器): 0x1201
  • 0x03 (栅极驱动 HS 寄存器): 0x1BFF
  • 0x04 (栅极驱动 LS 寄存器): 0x27FF
  • 0x05 (OCP 控制寄存器): 0x295F
  • 0x06 (CSA 控制寄存器): 0x3083

使用逻辑分析仪、我可以确认 STM32G431KBT6中的 SPI 时钟、CS 引脚和传输数据(MOSI)是否正确。 使能引脚也正常工作。 但是、从 DRV8323RS 返回的数据不符合预期。

我确保了通信格式遵循数据表中所述的格式 "编程" 章节(页次52/111)。 我本来希望读回我写入寄存器的值、但收到了我无法理解的意外数据。

即使我忽略了返回的数据并尝试更改了1PWM_DIR中的位也是如此 控制寄存器 若要反转电机的方向、则没有任何效果。 即使发送的字节看起来有效、寄存器似乎没有被正确写入。

我已经仔细检查了硬件连接是否有干扰、并使用示波器分析与逻辑分析仪结果相匹配的模拟信号。 我还确认了主器件和从器件之间的 SPI 配置一致、包括 MSBFIRST SPI 模式和时序要求。

您能帮助我确定此问题的原因吗? 为了读回正确的寄存器值并确保正确应用设置、我可以进行哪些更改或纠正?

我将分享 Arduino IDE 代码、逻辑分析仪屏幕截图和硬件设置详细信息、以便深入了解。

我编写此报告的原因是为了控制 A 具有393KV、20个极和10个极对的 BLDC 电机 消息流 FOC (场定向控制) 结合使用。 不过、我遇到了电流消耗和电机发热方面的问题。 我怀疑这些问题可能与驱动程序配置不正确有关、尤其是与有关 TDRIVE、IDRIVEP_LS、IDRIVEN_LS 中的配置设置 栅极驱动 LS 寄存器 IDRIVEP_HS、IDRIVEN_HS 中的配置设置 栅极驱动 HS 寄存器 控制峰值栅极拉电流和灌电流。

非常感谢您提供任何指导或建议!

0x02写入、读取

0x03写-读

0x04写-读

0x05写入读

0x06写入读

e2e.ti.com/.../Scirpt_5F00_FOC_5F00_Configuration_5F00_SPI.txt

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

    尊敬的 Zied:

    我认为一个开始使用 SPI 的好地方是在发送任何写入命令之前为器件加电并读取所有寄存器、并确保它与数据表中的值相匹配。 请随时在此处发布这些读取命令以便我进行分析。

    此致、

    Yara

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

    您好、Yara、

    感谢您的响应、

    它们与数据表中的默认值不匹配、

    0x02

      

    0x03

    0x04

    0x05

    0x06

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

    尊敬的 Zied:

    感谢您的注册!

    从我分析的结果来看、好像您的固件可能无法让 MCU 与器件有效通信。

     对于0x02、您的寄存器读取看起来显示的是0x04的默认值、而对于0x03、则显示的是0x06的默认值

    也许固件会使您的地址增加一倍?

    此致、

    Yara

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

    忘了提醒一下、您可以通过读取0x01来确认这一点、如果它为您提供了0x02的默认值、那么我们就知道会发生什么情况  

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

    您好、Yara、

    我将从寄存器地址0x01开始:  

    0x02

    0x03

    0x04

    0x05

    0x06

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

    尊敬的 Zied:

    您是否更改了代码中的任何内容? 我强烈建议您再回顾一下代码是如何处理 SPI 地址的。 0x01读取看起来像0x03的默认值、0x02读取看起来像0x06的默认值。

    此致、

    Yara

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

    `、我没有做任何更改;我只是为地址` 0x01 处的寄存器添加了一个读取操作。 您可以在 MOSI (黄色)线上看到帧已发送以接收响应。 我已经在原来的帖子中共享了代码、但如果需要、我还可以向您发送负责 SPI 写入和读取的特定函数。

    //Intialisation SPI  setup () {}
    
      SPI.begin();
      SPI.setClockDivider(SPI_CLOCK_DIV4); // Set SPI clock (adjust as necessary for your system, max 1 MHz for DRV8323)
      SPI.setDataMode(SPI_MODE0);            // CPOL = 0, CPHA = 0
      SPI.setBitOrder(MSBFIRST);             // MSB first
      SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); // Set SPI speed to 1 MHz
      configureDRV8323RS(); 
      configureDRV8323RS()
      SPI.endTransaction();
     ///////////////// 
    //configureDRV8323RS intialisation function 
    void configureDRV8323RS() {
      // Example: Configure the Control Register 1 (address 0x02) of DRV8323RS
      uint16_t address0x01 = 0x01;  // Address of Control Register 1
        uint16_t address0x02 = 0x02;  // Address of Control Register 1
      uint16_t data0x02 = 0x1201;   // Example data to configure the register (replace with actual values)
        uint16_t address0x03 = 0x03;  // Address of Control Register 1
      uint16_t data0x03 = 0x1BFF;   // Example data to configure the register (replace with actual values)
        uint16_t address0x04 = 0x04;  // Address of Control Register 1
      uint16_t data0x04 = 0x27FF;   // Example data to configure the register (replace with actual values)
          uint16_t address0x05 = 0x05;  // Address of Control Register 1
      uint16_t data0x05 = 0x295F;   // Example data to configure the register (replace with actual values)
          uint16_t address0x06 = 0x06;  // Address of Control Register 1
      uint16_t data0x06 = 0x3083;   // Example data to configure the register (replace with actual values)
    
      Serial.print("Writing to DRV8323RS Register 0x");
      Serial.print(address0x02, HEX);
      Serial.print(": 0x");
      Serial.println(data0x02, HEX);
        Serial.print("Writing to DRV8323RS Register 0x");
      Serial.print(address0x03, HEX);
      Serial.print(": 0x");
      Serial.println(data0x03, HEX);
        Serial.print("Writing to DRV8323RS Register 0x");
      Serial.print(address0x04, HEX);
      Serial.print(": 0x");
      Serial.println(data0x04, HEX);
        Serial.print("Writing to DRV8323RS Register 0x");
      Serial.print(address0x05, HEX);
      Serial.print(": 0x");
      Serial.println(data0x05, HEX);
        Serial.print("Writing to DRV8323RS Register 0x");
      Serial.print(address0x06, HEX);
      Serial.print(": 0x");
      Serial.println(data0x06, HEX);
    
      // Write to the register
        pinMode(PIN_ENABLE_DRV83, OUTPUT);
      pinMode(PIN_CAL_DRV83, OUTPUT);
      digitalWrite(PIN_ENABLE_DRV83, LOW);
      //digitalWrite(PIN_BRAKE_DRV83, HIGH);
      digitalWrite(PIN_CAL_DRV83, LOW);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, LOW);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(10);
      uint16_t readData = readDRV8323RS(address0x01);
      timer_delay_ms(10);
       readData = readDRV8323RS(address0x02);
      timer_delay_ms(10);
      readData = readDRV8323RS(address0x03);
      timer_delay_ms(10);
      readData = readDRV8323RS(address0x04);
      timer_delay_ms(10);
      readData = readDRV8323RS(address0x05);
      timer_delay_ms(10);
      readData = readDRV8323RS(address0x06);
      timer_delay_ms(10);
      writeDRV8323RS(address0x02, data0x02);
        timer_delay_ms(10);
      readData = readDRV8323RS(address0x02);
        Serial.print("Read back data: 0x");
      Serial.println(readData, HEX);
        digitalWrite(PIN_ENABLE_DRV83, LOW);
      //digitalWrite(PIN_BRAKE_DRV83, HIGH);
      digitalWrite(PIN_CAL_DRV83, LOW);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, LOW);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(10);
      writeDRV8323RS(address0x03, data0x03);
          timer_delay_ms(10);
      readData = readDRV8323RS(address0x03);
        Serial.print("Read back data: 0x");
      Serial.println(readData, HEX);
        digitalWrite(PIN_ENABLE_DRV83, LOW);
      //digitalWrite(PIN_BRAKE_DRV83, HIGH);
      digitalWrite(PIN_CAL_DRV83, LOW);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, LOW);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(10);
      writeDRV8323RS(address0x04, data0x04);
            timer_delay_ms(10);
      readData = readDRV8323RS(address0x04);
        Serial.print("Read back data: 0x");
      Serial.println(readData, HEX);
        digitalWrite(PIN_ENABLE_DRV83, LOW);
      //digitalWrite(PIN_BRAKE_DRV83, HIGH);
      digitalWrite(PIN_CAL_DRV83, LOW);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, LOW);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(10);
      writeDRV8323RS(address0x05, data0x05);
      timer_delay_ms(10);
      readData = readDRV8323RS(address0x05);
        Serial.print("Read back data: 0x");
      Serial.println(readData, HEX);
        digitalWrite(PIN_ENABLE_DRV83, LOW);
      //digitalWrite(PIN_BRAKE_DRV83, HIGH);
      digitalWrite(PIN_CAL_DRV83, LOW);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, LOW);
      timer_delay_ms(2);
      digitalWrite(PIN_ENABLE_DRV83, HIGH);
      timer_delay_ms(10);
      writeDRV8323RS(address0x06, data0x06);
        timer_delay_ms(10);
      readData = readDRV8323RS(address0x06);
      // Read back the register to verify
    
      Serial.print("Read back data: 0x");
      Serial.println(readData, HEX);
      timer_delay_ms(2);
      timer_delay_ms(2);
      digitalWrite(PIN_CAL_DRV83, HIGH);
      timer_delay_ms(2);
      digitalWrite(PIN_CAL_DRV83, LOW);
      timer_delay_ms(2);
      // Repeat for other registers as needed
    }
    void timer_delay_ms(uint16_t ms) {
      delay(ms);
    }
    /////////////////
    //Write SPI function
    void writeDRV8323RS(uint16_t addr, uint16_t data) {
      uint16_t commandword = ((addr << 11) | (data & 0x7FF)); // Combine address and data
    
      digitalWrite(CS_PIN, LOW); // Select DRV8323RS
    
      // Transmit the 16-bit command word
      SPI.transfer16(commandword);
    
      digitalWrite(CS_PIN, HIGH); // Deselect DRV8323RS
    
      delay(1);  // Allow some time between transmissions
    }
    ///////////////
    //read SPI function
    uint16_t readDRV8323RS(uint16_t addr) {
      uint16_t commandword = (0x8000 | (addr << 11)); // Prepare read command
      uint16_t result = 0;
    
    
      digitalWrite(CS_PIN, LOW); // Select DRV8323RS
    
      // Send the command word
      result = SPI.transfer16(commandword);
        //result = SPI.transfer16(0x0000); // Send dummy word to clock in the data from MISO
      digitalWrite(CS_PIN, HIGH); // Deselect DRV8323RS
    
      delay(1);  // Allow some time between transmissions
    
      return result;
    }
    ////////////////////

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

    尊敬的 Zied:

    当涉及到你的代码,我可能是最大的帮助,但我确实注意到一些有问题的行。

    digitalWrite (PIN_ENABLE_DRV83、低电平);
    //digitalWrite (PIN_BRAKE_DRV83、高电平);
    digitalWrite (PIN_CAL_DRV83、低电平);
    digitalWrite (PIN_ENABLE_DRV83、高电平);
    TIMER_DELAY_ms (2);
    digitalWrite (PIN_ENABLE_DRV83、低电平);
    TIMER_DELAY_ms (2);
    digitalWrite (PIN_ENABLE_DRV83、高电平);
    TIMER_DELAY_ms (10);

    切换驱动器上的使能引脚是否有原因?

    您是否只需配置 SPI、启用器件、读取所有寄存器并注释掉其他所有内容?

    此致、

    Yara

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

    您好、Yara、

    我通过在不需要数据读取或写入操作时将 SPI 引脚设置为低电平来优化 SPI 引脚、以区分写入命令和读取命令。 但是、没问题、我将向您发送一项配置、其中还包括在初始化期间将使能引脚设置为高电平状态。

    0x01

    0x02

    0x03

    0x04

    0x05

    0x06

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

    尊敬的 Zied:

    我可能误解了 PIN_ENABLE_DRV83在您的代码中的含义、这不是要控制驱动器上的 ENABLE 引脚吗? 或者这是为了控制 nSCS?

    此致、

    Yara

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

    您好、Yara、

    根据我发送给您的有关该主题的代码、以下是这些变量的含义:

    • PIN_ENABLE_DRV83 使能 反馈引脚处进行连接 BOOSTXL-DRV8323RS .
    • SS_PIN nSCS /增益 引脚(芯片选择)。
    • PIN_SPI_MOSI :对应于 SDI (串行数据输入)。
    • PIN_SPI_MISO :对应于 SDO (串行数据输出)。

    此外、在 SPI 读写函数 、您可以使用来验证信号活动 逻辑分析仪 . 我按照中列出的 SPI 编程步骤进行了操作 所述的要求 确保 SPI 引脚之间正确同步。

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

    尊敬的 Zied:

    我可能缺少了该链接、但我没有看到您控制 SS_PIN  (nSCS)的任何代码行? 我也没有在逻辑分析仪上看到您正在控制 SS_PIN (nSCS)

    此致、

    Yara

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

    您好、Yara、

    很抱歉混淆。

    我指的是 CS_PIN :nsss/gain 引脚(芯片选择)。

    我在setup()函数中使用了它来初始化 CS 引脚、以及在读取和写入函数中使用了它。

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

    尊敬的 Zied:

    那么是否也可以在 CS_PIN 上进行跟踪?

    我现在看一下你们的读取和写入函数。

    此致、

    Yara

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

    您好、Yara、

    我希望你们做得好、

    您可以从 LogicAnalyzer 中找到跟踪

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

    尊敬的 Zied:

    给我一整天的时间来看看这些波形。 自您上次回复以来、您是否更改过任何内容?

    此致、

    Yara

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

    您好、Yara、

    我希望您能表现得好。

    我没有进行任何更改。

    此致、
    Zied Jenhani

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

    尊敬的 Zied:

    我真的不知道 SPI 读写有什么问题。 让我分享一些我们用于器件通过 SPI 进行通信的代码

    void Config_evm_spi(void)
    {
        //Pin Config
        EALLOW;
        // SPI_MOSI
        GPIO_SetupPinOptions(16, GPIO_INPUT, GPIO_ASYNC | GPIO_PULLUP);
        // SPI_MISO
        GPIO_SetupPinOptions(17, GPIO_INPUT, GPIO_ASYNC | GPIO_PULLUP);
        // SPI_CS
        GPIO_SetupPinOptions(56, GPIO_INPUT, GPIO_ASYNC | GPIO_PULLUP);
        // SPI_CLK
        GPIO_SetupPinOptions(57, GPIO_INPUT, GPIO_ASYNC | GPIO_PULLUP);
    
        GPIO_SetupPinMux(16, GPIO_MUX_CPU1, 1);
        GPIO_SetupPinMux(17, GPIO_MUX_CPU1, 1);
        GPIO_SetupPinMux(56, GPIO_MUX_CPU1, 1);
        GPIO_SetupPinMux(57, GPIO_MUX_CPU1, 1);
        EDIS;
    
        EALLOW;
        ClkCfgRegs.LOSPCP.all = 0;
        EDIS;
    
        // Initialize SPI FIFO registers
        SpiaRegs.SPIFFTX.all=0xE040;
        SpiaRegs.SPIFFRX.all=0x2044;
        SpiaRegs.SPIFFCT.all=0x0;
    
        //SPI Settings
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;     //SPI Reset On
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;    //SCLK Active High
        SpiaRegs.SPICCR.bit.SPICHAR = 0x7;      //16-bit SPI char
        SpiaRegs.SPICCR.bit.SPILBK = 0;
    
        SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0;  //No overrun interrupt
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0;      //Phase 0
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;   //Master mode
        SpiaRegs.SPICTL.bit.TALK = 1;           //nSCS enabled
        SpiaRegs.SPICTL.bit.SPIINTENA = 0;      //TX/RX Interrupt Disabled
    
        SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = ((25000000 / 1000000) - 1);              //Set baud rate to 1MHz
        SpiaRegs.SPIPRI.bit.FREE = 1;           //Set so breakpoints don't disturb transmission
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;   //Exit SPI reset
    
    }
    
    Uint16 spi_xmit(Uint16 spiFrame)
    {
        SpiaRegs.SPITXBUF=spiFrame;
    
        //Wait for RX flag to indicate SPI frame completion
        while(SpiaRegs.SPIFFRX.bit.RXFFST != 1)
        {
        }
    
        return SpiaRegs.SPIRXBUF;
    }
    
    Uint16 spi_write(Uint16 addr, Uint16 data)
    {
        int i;
        Uint16 p_addr;
        Uint16 p_data;
        Uint16 commandword;
        Uint16 dummy;
    
        //8-bit header
        p_addr = spi_parity_calc(addr);
        commandword = ((addr << 1) & 0x7E)  | (p_addr << 0);
        SpiaRegs.SPITXBUF=commandword<<8; //transmit header
        dummy = SpiaRegs.SPIRXBUF;
    
    
        p_data = spi_parity_calc(data);
    
        //8 bit data1
        commandword = (p_data << 7) | ((data & 0x7F00) >> 8); //P + D14:D8
        SpiaRegs.SPITXBUF=commandword<<8; //transmit data
    
        //8 bit data2
        commandword = (data & 0x00FF);            //D7:D0
        SpiaRegs.SPITXBUF=commandword<<8;      //transmit data
        dummy = SpiaRegs.SPIRXBUF;
    
        while(SpiaRegs.SPIFFRX.bit.RXFFST != 3); //wait for 2 words to receive in FIFO
    
        return SpiaRegs.SPIRXBUF; //return last word
    }
    
    Uint16 spi_read(Uint16 addr)
    {
    
        Uint16 p_addr;
        Uint16 p_data;
        Uint16 commandword;
        Uint16 data, data1, data2;
        Uint16 dummy = 0xFF;
    
        //8-bit header
        p_addr = spi_parity_calc(addr);
        commandword = 0x80 | ((addr & 0x3F) << 1)  | (p_addr << 0);
        SpiaRegs.SPITXBUF=commandword<<8; //transmit header
        dummy = SpiaRegs.SPIRXBUF;
    
        p_data = spi_parity_calc(dummy);
    
    
        //8 bit data1
        commandword = ((p_data << 7) | dummy);
        SpiaRegs.SPITXBUF=commandword<<8; //transmit dummy
        data1 = SpiaRegs.SPIRXBUF;
    
        //8 bit data2
        commandword = 0xFF;
        SpiaRegs.SPITXBUF=commandword<<8;      //transmit dummy
        data2 = SpiaRegs.SPIRXBUF;
    
        while(SpiaRegs.SPIFFRX.bit.RXFFST != 3); //wait for 3 words to receive in FIFO
    
        dummy = SpiaRegs.SPIRXBUF;
        data1 = SpiaRegs.SPIRXBUF;          //read D14:D8
        data2 = SpiaRegs.SPIRXBUF;          //read D7:D0
    
        //while(SpiaRegs.SPIFFRX.bit.RXFFST != 3); //wait for 3 words to receive in FIFO
        data = (data1 << 8) | (data2); //concatenate D14:D0
        return data; //return D14:D0
    }
    
    bool spi_parity_calc(Uint16 word)   //calculates parity of word
    {
        uint16_t p = 0;
        while(word)
        {
           p ^= (word & 1);
           word >>= 1;
        }
        return(p);  //returns 0 or 1 for parity
    }

    我觉得您的代码可能访问了错误的地址。 其中一些 SPI 读取看起来与不同的地址相同。

    此致、

    Yara