Jump to content
    

Подключение датчика давления по I2C к STM32F4

Приветствую. Подключаю датчики давления XGZP6897D по I2C1 I2C2 к STM32F407VET6. Датчики не находятся.Адрес у них зашит, 0x6D. Как мне добиться от них ответа?

Если соединить оба I2C то они бодро передают инфу между собой. Подтяжка 4.7КОм есть

Мануал можно тут посмотреть https://www.compel.ru/pdf-items/cfsensor/ps/xgzp6897d/5055fe27b9afb20afda5a58b755e16a2

Заранее благодарен

Share this post


Link to post
Share on other sites

On 6/8/2025 at 6:15 PM, Александр11111111111 said:

Заранее благодарен

Осциллографом смотрели ?
Отладчиком смотрели ?
Номера регистров датчиков правильные используете ?

Share this post


Link to post
Share on other sites

Смотрел. Ответа нет.

Использовал команду  ret = HAL_I2C_IsDeviceReady(&hi2c1, 0x6D, 3, 5);

Эта не работает и другие тоже, соответственно.Может там хитрая адресация какая нужна для такого адреса?

Share this post


Link to post
Share on other sites

On 6/8/2025 at 7:11 PM, Александр11111111111 said:

Использовал команду  ret = HAL_I2C_IsDeviceReady(&hi2c1, 0x6D, 3, 5);

Похоже, что вы не читали документацию ни на HAL, ни на микроконтроллер, ни на датчик.
Так же следует познакомиться с работой самой шины I2C.

Share this post


Link to post
Share on other sites

Когда я соединял оба I2C друг с другом, то ведомому не мог такой адрес задать (7 битная адресация). Но с меньшим адресом они болтали друг с другом на ура.

23 минуты назад, dimka76 сказал:

Похоже, что вы не читали документацию ни на HAL, ни на микроконтроллер, ни на датчик.
Так же следует познакомиться с работой самой шины I2C.

Может что-то и не дочитал. Эта команда вроде как должна выдавать есть такой адрес или нет

Share this post


Link to post
Share on other sites

On 6/8/2025 at 7:42 PM, Александр11111111111 said:

Когда я соединял оба I2C друг с другом, то ведомому не мог такой адрес задать (7 битная адресация). Но с меньшим адресом они болтали друг с другом на ура.

0x6D => 0b1101101
Семь бит и есть.
 

On 6/8/2025 at 7:42 PM, Александр11111111111 said:

Может что-то и не дочитал. Эта команда вроде как должна выдавать есть такой адрес или нет

ret = HAL_I2C_IsDeviceReady(&hi2c1, (0x6DU << 1), 3, 5);

 

Share this post


Link to post
Share on other sites

Спасибо! вот я тупой, это уже после целого дня голова кругом идёт и пропустил, до этого так и писал) Заработало. А не подскажете команда записи и чтения правильные?  

regData =  0x0A;
 regAddress = 0x30;
HAL_I2C_Mem_Write_IT(&hi2c1, (I2C_ADDRESS << 1), &regAddress, 1, &regData, 1);

 regAddress = 0x06;
HAL_I2C_Mem_Read_IT(&hi2c1, (I2C_ADDRESS << 1), &regAddress, 1, aaa[1], 1);

Share this post


Link to post
Share on other sites

On 6/8/2025 at 8:05 PM, Александр11111111111 said:

 А не подскажете команда записи и чтения правильные ?

Не знаю, я не использую HAL

Share this post


Link to post
Share on other sites

7 minutes ago, Александр11111111111 said:

Спасибо! вот я тупой, это уже после целого дня голова кругом идёт и пропустил, до этого так и писал) Заработало. А не подскажете команда записи и чтения правильные?  

regData =  0x0A;
 regAddress = 0x30;
HAL_I2C_Mem_Write_IT(&hi2c1, (I2C_ADDRESS << 1), &regAddress, 1, &regData, 1);

 regAddress = 0x06;
HAL_I2C_Mem_Read_IT(&hi2c1, (I2C_ADDRESS << 1), &regAddress, 1, aaa[1], 1);

Это зависит от того, какой результат хочется получить

Share this post


Link to post
Share on other sites

В даташите датчика написано, что для получения давления нужно в 30 регистр подать команду 0x0A, а потом считать  регистры 06, 07, 08. Я подаю, считываю, но там нули. Но хоть откликаться стал


                                    regData =  0x0A;
                                     regAddress = 0x30;
                                    HAL_I2C_Mem_Write_IT(&hi2c1, (I2C_ADDRESS << 1), &regAddress, 1, &regData, 1);

                                     regAddress = 0x07;
                                    HAL_I2C_Mem_Read_IT(&hi2c1, (I2C_ADDRESS << 1), &regAddress, 1, aaa[1], 1);

Может там ещё что-то надо сделать?

Share this post


Link to post
Share on other sites

                   ret = HAL_I2C_IsDeviceReady(&hi2c1, (0x6D << 1), 3, 5);
                                      if (ret != HAL_OK) /* No ACK Received At That Address */
                                      {
                                       sprintf(trans_str, "  %x %x \n", regAddress, i);
                                       CDC_Transmit_FS((unsigned char*) trans_str, strlen(trans_str));
                                      }
                                      else if(ret == HAL_OK)
                                      {
                                       sprintf(trans_str, "  ура1 %d\n", i);
                                       CDC_Transmit_FS((unsigned char*) trans_str, strlen(trans_str));
                                      }
                                    HAL_Delay(20);
                                    ret = HAL_I2C_IsDeviceReady(&hi2c2, (0x6D << 1), 3, 5);
                                                                         if (ret != HAL_OK) /* No ACK Received At That Address */
                                                                         {
                                                                          sprintf(trans_str, "  %x %x \n", regAddress, i);
                                                                          CDC_Transmit_FS((unsigned char*) trans_str, strlen(trans_str));
                                                                         }
                                                                         else if(ret == HAL_OK)
                                                                         {
                                                                          sprintf(trans_str, "  ура2 %d\n", i);
                                                                          CDC_Transmit_FS((unsigned char*) trans_str, strlen(trans_str));
                                                                         }
                                    regData =  0x0A;
                                     regAddress = 0x30;
                                    HAL_I2C_Mem_Write_IT(&hi2c1, (0x6D << 1), &regAddress, 1, &regData, 100);
                                  HAL_Delay(20);
                                    // whyle (!(HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), regAddress & 0x08, 1, aaa[5], 100)));

                                     regAddress = 0x06;
                                    HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), &regAddress, 1, aaa[0], 100);
                                     regAddress = 0x07;
                                    HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), &regAddress, 1, aaa[1], 100);
                                     regAddress = 0x08;
                                    HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), &regAddress, 1, aaa[2], 100);

 

Часть с ret = HAL_I2C_IsDeviceReady работает , два датчика отзываются.

Нижняя часть не работает, выдаёт 0 во всех регистрах.

Сейчас закомментированы функции (не знаю что в них писать, и с ними не работало )

//void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
//{
//  HAL_I2C_Master_Receive_IT(&hi2c1, (I2C_ADDRESS << 1), &regData, 1);
//}
//void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
//{
  // I2C data ready!
//}

Share this post


Link to post
Share on other sites

Ура!! Заработало!!

Вот вариант

                                    regData =  0x0A;
                                     regAddress = 0x30;
                                    HAL_I2C_Mem_Write_IT(&hi2c1, (0x6D << 1), 0x30, 1, &regData, 100);
                                  HAL_Delay(20);


                                    HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), 0x06, 1, &aaa[0], 100);

                                    HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), 0x07, 1, &aaa[1], 100);

                                    HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), 0x08, 1, &aaa[2], 100);

 

И так работает

aaa[0] = 0x30;
aaa[1] = 0x0a;
HAL_I2C_Master_Transmit(&hi2c1, (0x6D << 1), aaa, 2, 100);
HAL_Delay(20);
HAL_I2C_Mem_Read(&hi2c1, (0x6D << 1), 0x06, 1, aaa, 3, 100);

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...