Part Number:DRV8305-Q1EVMOther 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错误时,对应才会被置位,为出错情况下是不是保持不变?
Cherry Zhou:
您好,您的问题我们需要升级到英文论坛寻求帮助,如有答复将尽快回复您。
,
Cooper White:
我将nFault引脚跟一个LED灯相连,如果nFault低电平,是可以看到LED灯会亮:
正常运行过程中,电机正常控制,LED是一直常灭。
根据下面这个帖子,寄存器0x1的FAULT字段应该是一直为0才对,但我通过SPI读取回来的值是不断在0,1之间跳变。
e2e.ti.com/…/drv8305-nfault-in-status-register
,
Cooper White:
通过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 wordctrlWord = (uint16_t)DRV8305_buildCtrlWord(CtrlMode_Read,regAddr,data);// reset the Rx fifo pointer to zeroSPI_resetRxFifo(obj->spiHandle);SPI_enableRxFifo(obj->spiHandle);// write the commandSPI_write(obj->spiHandle,ctrlWord);// wait for the response to populate the RX fifo, else a wait timeout will occurwhile((RxFifoCnt < SPI_FifoStatus_1_Word) && (WaitTimeOut < 0xffff)){RxFifoCnt = SPI_getRxFifoStatus(obj->spiHandle);if(++WaitTimeOut > 0xfffe){obj->RxTimeOut = true;}}// Read the wordreadWord = SPI_readEmu(obj->spiHandle);return(readWord & DRV8305_DATA_MASK); } // end of DRV8305_readSpi() function
,
Cherry Zhou:
Cooper White said:
问题 1:寄存器0x01的FAULT字段是不是跟Drv8305引脚的状态对应的?
如果Drv8305引脚是高电平,则寄存器0x1的FAULT字段是不是一直是0,如果Drv8305引脚是低电平,则寄存器0x1的FAULT字段一直是1。是不是这样的对应关系?
是的,如果检测到故障,那么0x1的第10位将为1。
Cooper White said:问题 2:寄存器0x2,0x3的值是不是只有发生nFault错误时,对应才会被置位,为出错情况下是不是保持不变
是的,由于0x2和0x3中的所有位仅在发生故障时变为1,因此如果 nFAULT 为高电平,它们则不会改变。 有关故障寄存器的详细信息,请参阅第7.6.1节。 数据表中的第7.3.8节提供了有关故障状况的更多信息。
其他问题我们需要向工程师确认,应该会在下周工作日给到您答复。
,
Cherry Zhou:
Cooper White said:根据下面这个帖子,寄存器0x1的FAULT字段应该是一直为0才对,但我通过SPI读取回来的值是不断在0,1之间跳变。
请参阅数据表的第7.3.8.1节,了解 SPI 寄存器故障位何时会开启以及 nFAULT 引脚何时会变为低电平。 您参考的帖子是正确的,但您可以在数据表中找到更广泛的信息。
Cooper White said:通过SPI去读取8305的状态,允许的最快频率是多少,最快可以1秒钟读取多少次?
有关此信息请参阅数据表中的第6.6节。 下表应包含所需的所有 SPI 时序信息。 由于最小 SPI 时钟周期为100ns,因此最大时钟频率为10MHz。
Cooper White said:会不会是读取超时,导致SPIRXEMU寄存器的值是未定义,导致这个问题的出现。
请检查是否遵守数据表中列出的 SPI 要求。