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.

DRV8305-Q1EVM: Drv8305的nFault问题

Part Number: DRV8305-Q1EVM
Other Parts Discussed in Thread: DRV8305, MOTORWARE

我使用F28069M+Drv8305的方案做无刷直流电机的控制。

控制过程中,Drv8305会出现nFautt错误,nFault引脚会置为低电平.

根据Dr8305 datasheet手册的指引,我通过SPI读取会寄存器0x1,0x2,0x3的值,以辅助定位问题。

但是有个奇怪的问题,寄存器0x01的FAULT字段,即使在Drv8305没有错误发生时,时不时在0,1来回变化,并不是保持不变的,0x2,0x3的一些字段的值在未发生错误时也会变化。

问题 1:寄存器0x01的FAULT字段是不是跟Drv8305引脚的状态对应的?

如果Drv8305引脚是高电平,则寄存器0x1的FAULT字段是不是一直是0,如果Drv8305引脚是低电平,则寄存器0x1的FAULT字段一直是1。是不是这样的对应关系?

问题 2:寄存器0x2,0x3的值是不是只有发生nFault错误时,对应才会被置位,为出错情况下是不是保持不变?

  • 您好,您的问题我们需要升级到英文论坛寻求帮助,如有答复将尽快回复您。

  • 我将nFault引脚跟一个LED灯相连,如果nFault低电平,是可以看到LED灯会亮:

    正常运行过程中,电机正常控制,LED是一直常灭。

    根据下面这个帖子,寄存器0x1的FAULT字段应该是一直为0才对,但我通过SPI读取回来的值是不断在0,1之间跳变。

  • 通过SPI去读取8305的状态,允许的最快频率是多少,最快可以1秒钟读取多少次?

    如果太过频繁的读取,会不会引起这个问题?

    贵公司MotorWare的DRV8305的读取实现,是有超时限制的,如果读取超时了,仍然会去取SPIRXEMU的数据作为返回值的。

    会不会是读取超时,导致SPIRXEMU寄存器的值是未定义,导致这个问题的出现。

    下面是贵司的8305读取代码的实现:

    
    uint16_t DRV8305_readSpi(DRV8305_Handle handle,const DRV8305_Address_e regAddr)
    {
      DRV8305_Obj *obj = (DRV8305_Obj *)handle;
      uint16_t ctrlWord;
      const uint16_t data = 0;
      volatile uint16_t readWord;
      static volatile uint16_t WaitTimeOut = 0;
      volatile SPI_FifoStatus_e RxFifoCnt = SPI_FifoStatus_Empty;
    
      // build the control word
      ctrlWord = (uint16_t)DRV8305_buildCtrlWord(CtrlMode_Read,regAddr,data);
    
      // reset the Rx fifo pointer to zero
      SPI_resetRxFifo(obj->spiHandle);
      SPI_enableRxFifo(obj->spiHandle);
    
      // write the command
      SPI_write(obj->spiHandle,ctrlWord);
    
      // wait for the response to populate the RX fifo, else a wait timeout will occur
      while((RxFifoCnt < SPI_FifoStatus_1_Word) && (WaitTimeOut < 0xffff))
      {
        RxFifoCnt = SPI_getRxFifoStatus(obj->spiHandle);
    	if(++WaitTimeOut > 0xfffe)
    	{
    		obj->RxTimeOut = true;
    	}
      }
    
      // Read the word
      readWord = SPI_readEmu(obj->spiHandle);
    
      return(readWord & DRV8305_DATA_MASK);
    } // end of DRV8305_readSpi() function
    

  • 问题 1:寄存器0x01的FAULT字段是不是跟Drv8305引脚的状态对应的?

    如果Drv8305引脚是高电平,则寄存器0x1的FAULT字段是不是一直是0,如果Drv8305引脚是低电平,则寄存器0x1的FAULT字段一直是1。是不是这样的对应关系?

    是的,如果检测到故障,那么0x1的第10位将为1。 

    问题 2:寄存器0x2,0x3的值是不是只有发生nFault错误时,对应才会被置位,为出错情况下是不是保持不变

    是的,由于0x2和0x3中的所有位仅在发生故障时变为1,因此如果 nFAULT 为高电平,它们则不会改变。 有关故障寄存器的详细信息,请参阅第7.6.1节。 数据表中的第7.3.8节提供了有关故障状况的更多信息。 

    其他问题我们需要向工程师确认,应该会在下周工作日给到您答复。 

  • 根据下面这个帖子,寄存器0x1的FAULT字段应该是一直为0才对,但我通过SPI读取回来的值是不断在0,1之间跳变。

    请参阅数据表的第7.3.8.1节,了解 SPI 寄存器故障位何时会开启以及 nFAULT 引脚何时会变为低电平。 您参考的帖子是正确的,但您可以在数据表中找到更广泛的信息。 

    通过SPI去读取8305的状态,允许的最快频率是多少,最快可以1秒钟读取多少次?

    有关此信息请参阅数据表中的第6.6节。 下表应包含所需的所有 SPI 时序信息。 由于最小 SPI 时钟周期为100ns,因此最大时钟频率为10MHz。 

    会不会是读取超时,导致SPIRXEMU寄存器的值是未定义,导致这个问题的出现。

    请检查是否遵守数据表中列出的 SPI 要求。