主题中讨论的其他器件: USB2ANY
工具/软件:
我一直尝试使用 DRV2624 来播放自定义波形。 除了运行自动校准时、我似乎无法对触觉电机执行任何振动。 我知道有一个内置的 RAM、必须以特定的方式将波形写入到其中。 对于写入操作顺序、当涉及到其配置字节和波形本身(电压-时间对)时、我对写入操作顺序有点困惑、不知道整个序列的写入顺序和寄存器。
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.
您好:
您使用的是 EVM 还是定制电路板?
我建议使用我们的 GUI Haptic Control Console。 这使得在模式之间切换和播放波形变得非常简单。 它还有一个 RAM 管理器。 www.ti.com/.../HAPTICS-CONSOLE
此致、
Sydney Northcutt
目前、我将执行以下测试。 请引导我说明可能出现的问题。 主要思路是将波形的标头写入 RAM、然后写入波形、并验证增量、看看效果是否正确写入。
// Write start location
uint8_t write_buffer[2] = {0xfd, 0x00};
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write RAM location MSB");
return;
}
ESP_LOGI("I2C", "Successfully written RAM start location MSB");
write_buffer[0] = 0xfe;
write_buffer[1] = 0x01;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write RAM location LSB");
return;
}
ESP_LOGI("I2C", "Successfully written RAM start location LSB");
// Read for increment
uint8_t read_buffer;
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
// Write effect size
write_buffer[0] = 0xff;
write_buffer[1] = 0x08;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write effect size to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written effect size to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
// Write effect
write_buffer[0] = 0xff;
write_buffer[1] = 0x1f;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
write_buffer[0] = 0xff;
write_buffer[1] = 120;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
write_buffer[0] = 0xff;
write_buffer[1] = 0;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
write_buffer[0] = 0xff;
write_buffer[1] = 80;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
write_buffer[0] = 0xff;
write_buffer[1] = 0x3f;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
write_buffer[0] = 0xff;
write_buffer[1] = 120;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
write_buffer[0] = 0xff;
write_buffer[1] = 0;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
write_buffer[0] = 0xff;
write_buffer[1] = 80;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write to RAM");
return;
}
ESP_LOGI("I2C", "Successfully written to RAM");
// Read for increment
write_buffer[0] = 0xfe;
if (i2c_master_transmit_receive(drv2624_handle, write_buffer, 1, &read_buffer, sizeof(read_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to read RAM location");
return;
}
ESP_LOGI("I2C", "Successfully read RAM location: %d", read_buffer);
这是输出

我不确定自己对写入的理解、因为在写入效应大小(波形的配置字节)时、RAM 没有增量。 这是预期行为还是出现了问题?
完成上述操作后、我唤醒 DRV2624 模块、然后将 GO 位设置为 1 以运行波形。 默认情况下、序列应该是开头的波形索引 1、其余零。 因此、它应该会在播放该波形一次后自动停止。
write_buffer[0] = 0x07;
write_buffer[1] = 0b01001001;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to wake up DRV2624");
return;
}
ESP_LOGI("I2C", "Successfully woke up DRV2624");
write_buffer[0] = 0x0c;
write_buffer[1] = 1;
if (i2c_master_transmit(drv2624_handle, write_buffer, sizeof(write_buffer), 100) != ESP_OK)
{
ESP_LOGE("I2C", "Failed to write go bit");
return;
}
ESP_LOGI("I2C", "Successfully started effect");
不过、执行此操作时我看不到电机完全在移动。
尊敬的 Adithya:
由于您没有看到任何负载结果、下面我们来移除 RAM 部分、这样可以确保这是问题。 要设置的一个简单模式是实时播放 (RTP) 模式。 下面的脚本将 RTP 模式设置为低振幅 (25%)。 您能否运行以下脚本以确保负载正确振动?
宽 5a e 1f #RTP 模式、25%
W 5a c 1. #trigger GO 位
延迟时间
W 5a c 0 #stop go bit
下面还有有关使用 DRV2624 进行 RAM 操作的文档。
e2e.ti.com/.../DRV26x4-RAM-Operation-_2D00_-External.docx
此致、
Sydney Northcutt