ST意法半导体
直播中

贾桂林

7年用户 1418经验值
私信 关注
[问答]

如何使用HAL_DSI_Read()的示例呢

为了进行测试,我尝试使用带有 MB1166 OTM8009A LCD 的 STM32F769-DISCO 板读取当前 LCD 亮度 - 0x5E 寄存器。
DSI 已针对命令模式正确配置 - 写入工作正常。我知道,因为显示已正确初始化。
我到处看了看,但没有找到有关如何使用HAL_DSI_Read()的示例。
我遇到的一篇文章建议首先调用 HAL_DSI_ConfigFlowControl(hdsi, DSI_FLOW_CONTROL_BTA)。这似乎有所帮助,没有超时错误,但没有任何内容被读取。
请指教。这似乎是反复出现的问题,没有答案,甚至没有人成功的迹象。以下是我尝试过的。
  • void test() {
  •   uint8_t buffer[2];
  •   memset(buffer, 0, 2);
  •   MyDsiRead1Param(&hdsi_discovery, 0x5E, buffer, 2);
  • }
  • void MyDsiReadCmd(DSI_HandleTypeDef *hdsi, uint8_t cmd, uint8_t *buffer, uint32_t size) {
  •     HAL_StatusTypeDef status = HAL_DSI_ConfigFlowControl(hdsi, DSI_FLOW_CONTROL_BTA);
  •     if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_ConfigFlowControl().");
  •     status = HAL_DSI_Read(hdsi, LCD_CHANEL_ID, buffer, size, DSI_DCS_SHORT_PKT_READ, cmd, (uint8_t[]){0, 0});
  •     if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_Read().");
  • }
  • void MyDsiRead1Param(DSI_HandleTypeDef *hdsi, uint8_t param, uint8_t *buffer, uint32_t size) {
  •     HAL_StatusTypeDef status = HAL_DSI_ConfigFlowControl(hdsi, DSI_FLOW_CONTROL_BTA);
  •     if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_ConfigFlowControl().");
  •     status = HAL_DSI_Read(hdsi, LCD_CHANEL_ID, buffer, size, DSI_GEN_SHORT_PKT_READ_P1, 0, (uint8_t[]){param, 0});
  •     if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_Read().");
  • }









回帖(1)

李芳

2022-12-16 10:24:13
好的,我已经弄清楚了。MIP-DSI 规范版本。1.01 不包含读取任意注册表的命令。
现在可以读取设备描述符块 (DDB)。有趣的是,所有三种 MyDsiRead* 方法都有效。


  • /* @brief Read Device Descriptor Block (DDB), MIPI-DCS Specs ver 1.01, section 6.21 */
  • void ReadDsiDdb(void) {
  •         const uint8_t len = 5;
  •         uint8_t buffer[len];
  •         memset(buffer, 0, len);
  •         MyDsiRead1Param(&hdsi_discovery, 0xA1, buffer, len);
  •         uint16_t supplierId = (buffer[0] << 8) | buffer[1];   // expect 395 (ORISE)
  •         uint16_t supplierData = (buffer[2] << 8) | buffer[3]; // for OTM8009A expect 0x8009
  •         uint8_t escapeCode = buffer[4]; // 0xFF exit code, 0x00 escape code, any other value: more data to read
  • }

  • void MyDsiReadCmd(DSI_HandleTypeDef *hdsi, uint8_t cmd, uint8_t *buffer, uint32_t size) {
  •         HAL_StatusTypeDef status = HAL_DSI_ConfigFlowControl(hdsi, DSI_FLOW_CONTROL_BTA);
  •         if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_ConfigFlowControl().");

  •         status = HAL_DSI_Read(hdsi, LCD_CHANEL_ID, buffer, size, DSI_DCS_SHORT_PKT_READ, cmd, (uint8_t[]){0, 0});
  •         if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_Read().");
  • }

  • void MyDsiRead1Param(DSI_HandleTypeDef *hdsi, uint8_t param, uint8_t *buffer, uint32_t size) {
  •         HAL_StatusTypeDef status = HAL_DSI_ConfigFlowControl(hdsi, DSI_FLOW_CONTROL_BTA);
  •         if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_ConfigFlowControl().");

  •         status = HAL_DSI_Read(hdsi, LCD_CHANEL_ID, buffer, size, DSI_GEN_SHORT_PKT_READ_P1, 0, (uint8_t[]){param, 0});
  •         if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_Read().");
  • }

  • void MyDsiRead2Param(DSI_HandleTypeDef *hdsi, uint16_t param, uint8_t *buffer, uint32_t size) {
  •         uint8_t params[2];
  •         params[0] = param & 0xFF;
  •         params[1] = (param >> 8) & 0xFF;

  •         HAL_StatusTypeDef status = HAL_DSI_ConfigFlowControl(hdsi, DSI_FLOW_CONTROL_BTA);
  •         if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_ConfigFlowControl().");

  •         status = HAL_DSI_Read(hdsi, LCD_CHANEL_ID, buffer, size, DSI_GEN_SHORT_PKT_READ_P2, 0, params);
  •         if (status != HAL_OK) MBED_ERROR(status, "Error calling HAL_DSI_Read().");
  • }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分