主题中讨论的其他器件: TM4C1294NCPDT
先生,
很抱歉,我的回复太迟了。 该查询涉及 DRV8711:DRV8711步进驱动器寄存器读取问题的连续性。
您问的最后一个问题是, 每个设备都有自己的专用片选(CS)信号。 是否使用正确的 CS 信号读取所需的驱动器?
是的、每个器件都有自己的专用 CS 信号。 但读取将仅在第5次尝试时完成。 请尽快解决此问题。
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.
先生,
很抱歉,我的回复太迟了。 该查询涉及 DRV8711:DRV8711步进驱动器寄存器读取问题的连续性。
您问的最后一个问题是, 每个设备都有自己的专用片选(CS)信号。 是否使用正确的 CS 信号读取所需的驱动器?
是的、每个器件都有自己的专用 CS 信号。 但读取将仅在第5次尝试时完成。 请尽快解决此问题。
你(们)好。
感谢您的及时响应。 我们将使用4个步进电机和4个 DRV 8711驱动器 IC。 在下图中、我解释了每个电机有一个芯片选择(CS)引脚、这个单独的 CS 引脚连接到微控制器。
供您参考
SPI_LSU_SuctionArm_Motor_CS_High GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_6、GPIO_PIN_6);
SPI_LSU_Economizer_Motor_CS_High GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_4、GPIO_PIN_4);
SPI_RSU_SuctionArm_Motor_CS_High GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);
SPI_RSU_Economizer_Motor_CS_High GPIOPinWrite (GPIO_PORTL_BASE、GPIO_PIN_0、GPIO_PIN_0);
我已连接各个 CS 引脚。请告诉我如何一次尝试读取数据。 提前感谢。
你(们)好。
感谢您的答复。 我尝试根据你的上述想法,但我没有看到任何变化。 请确保我的代码用于在首次尝试时读取数据。
写入序列:
void SPI_DRV8711_Write (unsigned char dataHi、unsigned char dataLO)
{
开关(Stepper_Motor_Nodeid)
{
情形1:
G_Write_Data01[0]= dataHi;
G_Write_Data01[1]= dataLO;
SPI_Motor1_CS_High;
SysCtlDelay (500);//5us
SSIDataPut (SSI2_base、dataHi);
while (SSIBusy (SSI2_base));
SSIDataPut (SSI2_base、dataLo);
while (SSIBusy (SSI2_base));
MOTOR1_CS_Low;
中断;
案例2至案例4剩余的 电机序列(电机1、电机2、电机3)与案例1相同。
读取序列:
unsigned int SPI_DRV8711_read (unsigned char dataHi、unsigned char dataLo)
READ_Data = 0;
SPIMotor1_CS_High;
SysCtlDelay (500);//5us
SSIDataPut (SSI2_base、dataHi);
while (SSIBusy (SSI2_base));
SSIDataGet (SSI2_base、&RxdataHi);
SSIDataPut (SSI2_base、dataLo);
while (SSIBusy (SSI2_base));
SSIDataGet (SSI2_base、&RxdataLo);
G_READ_Data01[0]= 0x80 ^ RxdataLO;
G_READ_DATA01[1]= RxdataHi;
MOTOR1_CS_Low;
中断;
案例2至案例4剩余的电机序列(电机1、电机2、电机3)与案例1相同。
如果您需要任何信息、请告诉我。
谢谢你
尊敬的 Murugavel:
谢谢你。
我附加了原理图以供您参考。这款 TM4C1294NCPDT 控制器。 我们将微控制器中的1k 上拉电阻器(中的 SPI 数据)连接到 drv8711中的 SDATAO 引脚。我确信我们没有将任何上拉输入(SPI 数据输出)连接到 drv8711中的 SDATAIN 引脚。
SCS、SDATI、SDATO 和 SCLK 示波器图我将很快发布。
谢谢你
您好、Tom、
根据这些波形、似乎 MCU SSI 配置与 DRV8711 SPI 格式不匹配。 请确认您的示波器截图是否用于写入操作。 在写入操作期间(MSB 逻辑低电平)、SDATAO 将保持高电平。 我不确定这是否是您观察到的情况。 示波器捕获显示了 SDATAO 上的一些活动。 我不确定这是在写入还是读取操作期间发生的。 请澄清。
我设置了 DRV8711 EVM、并尝试复制与测试用例相同的写入操作、扭矩寄存器= 0xF0、来自其默认值0xFF。
这是对扭矩寄存器的首次读取、以确认默认设置确实为0xFF。
在这次读取之后、我对 SDATAI 值= 0xF0的该寄存器进行了写操作。 请参阅以下代码片段。 请注意、通道的序列与信号标签的上一个片段相同。 另请注意、在写入操作期间 SDATA0为高电平。
我立即对扭矩寄存器进行了单次读取。 请参阅以下代码片段。 首次尝试时、读取并正确显示新写入的值。 这确认了写操作和读操作均按预期执行。
我无法重现您在系统中使用 MCU 时遇到的情况。 请验证 MCU 的 SPI (SSI)配置。 该问题指向系统中 MCU 的 SSI 配置问题。
为了清楚起见、我将在单独的回复中说明我对您发送的 MCU 数据包示波器截图的观察结果。
此致、Murugavel
您好、Tom、
根据其中一个示波器捕获的以下片段-请参阅下面的片段- SDATAO 行在基于您的另一个捕获的时钟和 SCS 之后一段时间内未变为高电平。 诊断时、SCS 与这两个通道一起使用会很有用。 如果无法实现、则仅限 SCS 和 SDATAO。 无论如何、这都指向 MCU SPI 外设的 SSI 配置问题。
理想情况下、我希望分别针对写入和读取操作获得四通道捕获。 您遇到的问题 似乎与 MCU 配置有关。 如果您找不到正确的配置、可能需要联系 MCU 支持 E2E。 同时、我很乐意回答您关于 DRV8711器件及其 SPI 通信的任何问题。 谢谢。
请确保配置与数据表要求匹配,请参阅的第27页。 https://www.ti.com/lit/ds/symlink/drv8711.pdf 。
此致、Murugavel
尊敬的 Murugavel:
感谢您的宝贵答复。我们针对您的上述说明进行了实验。我附上了读写值供您参考。
还要确保下面的读取/写入代码正确吗?
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
GPIOPinConfigure (GPIO_PD3_SSI2CLK);
//GPIOPinConfigure (GPIO_PD2_SSI2FSS);
GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
GPIOPinTypeSSI (GPIO_PORTD_BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3);
SSIConfigSetExpClk (SSI2_base、g_ui32SysClkFreq、SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、500000、8);
SSIEnable (SSI2_base);
您好、Tom、
谢谢你。 我不确定我是否遵循您发布的表格。 扭矩寄存器的前两行似乎是 SDATAI。 第三行是什么? 假设在第2行所示的读取操作期间是 SDATAO、那么显然该写入操作没有正确完成。 这就是我在上一次答复中提到的,似乎存在协议问题。 同时查看四个通道以验证协议的唯一方法。 是否可以为表中的每行提供此信息?
很遗憾、我不熟悉您的代码的宏函数。 我将尽力理解它、并向您提供反馈。 如需深入了解您的宏代码、您必须在微控制器论坛中寻求 E2E 支持。
在配置宏中、我确实注意到您正在将 SSI 配置为 SSI_FRF_MOTO_MODE_0。 根据用户指南(UG)中的器件说明"当 SPH 相位控制位清零时、在第一个时钟边沿转换时捕获数据。 如果 SPH 位为1、则在第二个时钟边沿转换时捕获数据。"。 MODE_0看起来不是与 DRV8711连接的正确模式。 您应该使用设置了 SPH 位的模式、以便 在第二个时钟边沿捕获数据。 我无法100%确定 该值是否在此 MCU 的宏中被调用为 SSI_FRF_MOTO_MODE_1。 请验证。 本质上、您应该使用 SPO = 0和 SPH = 1的模式。 " SPO = 0、SPH = 1时的飞思卡尔 SPI 帧格式。" 请尝试使用此设置。 它应该能解决您的问题。 请告诉我们它是否起作用。 谢谢。
此致、Murugavel
感谢您的支持。
实际上、我们无法在一个示波器中显示全部4个引脚。 我尝试了所有你说在上述查询,仍然不知道什么 drv 参数调整为单读.
我为您提供了第一个意见、我在此附上了应用逻辑中的写入和读取顺序。请确保此供我参考。
情形0://电机电流
if (((Motor.Stall=1)&(Motor.Fault==1))
{
if (Start=1)
{
STEPPER Motor_Nodeid = 1;
Motor_Torque_Register.Torque = 0xF0;
Motor.Write_Cmplt = 0; //当写入完成时
Motor.Write = 1;
while (!(g_cal_lsu_SuctionArm_Motor.Write_Cmplt) //如果写入未完成
{
G_Stepper_Motor_Nodeid = 1;
如果(READ_DATA01[01]==Motor_Torque_Register.Torque) //写入数据和扭矩将相同
{
Motor.Write_Cmplt=1; //写入数据已完成
}
方案
{
motor_current_WriteSequenece (); //写入序列已上传
}
}
Motor.Write_Cmplt_Fault = 0;
STEPPER Motor_Nodeid = 0;
MOTOR.HOLD_Sequnece =停止;
motor.setspeed =速度;
SetPluses = MotorDegree;
Motor_pulse_calculation();
Motor.Sequnece_No = 1;
}
}
方案
{
....}
中断;
您好、Tom、
感谢您的更新。 我的确了解了您获得全部四个通道的限制条件、非常感谢您提供所有所需的捕获。 我试图从您发送的捕获中找出问题的根本原因。 DRV8711旨在响应单个正确的 SPI 写入或读取操作。 SPI 时序不需要进行调优、只需匹配发布的时序要求即可。 我在设置中尝试了这种情况、并验证确实如此。 我们在 EVM 中使用 的 MSP430、它是与您使用的 TM4C1294NCPDT MCU 不同的 MCU。 我不熟悉它的 SSI SPI 模式设置、因此我建议与微控制器团队建立一个 E2E 支持主题。 我能想到的最后一件事是将 SPI 时钟频率降至1MHz 或500kHz、然后查看一次写入和读取是否成功。
如果我理解正确、您已经针对代码问题实施了权变措施、该权变措施将进行多次 写入序列尝试、直到读取值与写入值匹配。 假设您能够在几个写入和始终读取的周期内成功写入/读取验证值、这可能是一个逻辑问题。 我的问题是、如果在温度和电源电压变化等不同的工作条件下卡在 while 环路中、会发生什么情况。 我希望您有 一个解决方案、可以通过 SPI 写入或读取操作成功写入和读取 DRV8711寄存器。 如果不是、对于此权变措施、也许可以在写入/读取尝试次数超过固定尝试次数时实现从循环退出、假设为5、并标记错误情况。
此致、Murugavel 。