Александр11111111111 0 Sunday at 03:15 PM Posted Sunday at 03:15 PM · Report post Приветствую. Подключаю датчики давления XGZP6897D по I2C1 I2C2 к STM32F407VET6. Датчики не находятся.Адрес у них зашит, 0x6D. Как мне добиться от них ответа? Если соединить оба I2C то они бодро передают инфу между собой. Подтяжка 4.7КОм есть Мануал можно тут посмотреть https://www.compel.ru/pdf-items/cfsensor/ps/xgzp6897d/5055fe27b9afb20afda5a58b755e16a2 Заранее благодарен Quote Share this post Link to post Share on other sites More sharing options...
dimka76 70 Sunday at 03:52 PM Posted Sunday at 03:52 PM · Report post On 6/8/2025 at 6:15 PM, Александр11111111111 said: Заранее благодарен Осциллографом смотрели ? Отладчиком смотрели ? Номера регистров датчиков правильные используете ? Quote Share this post Link to post Share on other sites More sharing options...
Александр11111111111 0 Sunday at 04:11 PM Posted Sunday at 04:11 PM · Report post Смотрел. Ответа нет. Использовал команду ret = HAL_I2C_IsDeviceReady(&hi2c1, 0x6D, 3, 5); Эта не работает и другие тоже, соответственно.Может там хитрая адресация какая нужна для такого адреса? Quote Share this post Link to post Share on other sites More sharing options...
dimka76 70 Sunday at 04:21 PM Posted Sunday at 04:21 PM · Report post On 6/8/2025 at 7:11 PM, Александр11111111111 said: Использовал команду ret = HAL_I2C_IsDeviceReady(&hi2c1, 0x6D, 3, 5); Похоже, что вы не читали документацию ни на HAL, ни на микроконтроллер, ни на датчик. Так же следует познакомиться с работой самой шины I2C. Quote Share this post Link to post Share on other sites More sharing options...
Александр11111111111 0 Sunday at 04:42 PM Posted Sunday at 04:42 PM · Report post Когда я соединял оба I2C друг с другом, то ведомому не мог такой адрес задать (7 битная адресация). Но с меньшим адресом они болтали друг с другом на ура. 23 минуты назад, dimka76 сказал: Похоже, что вы не читали документацию ни на HAL, ни на микроконтроллер, ни на датчик. Так же следует познакомиться с работой самой шины I2C. Может что-то и не дочитал. Эта команда вроде как должна выдавать есть такой адрес или нет Quote Share this post Link to post Share on other sites More sharing options...
dimka76 70 Sunday at 04:59 PM Posted Sunday at 04:59 PM · Report post 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); Quote Share this post Link to post Share on other sites More sharing options...
Александр11111111111 0 Sunday at 05:05 PM Posted Sunday at 05:05 PM · Report post Спасибо! вот я тупой, это уже после целого дня голова кругом идёт и пропустил, до этого так и писал) Заработало. А не подскажете команда записи и чтения правильные? regData = 0x0A; regAddress = 0x30; HAL_I2C_Mem_Write_IT(&hi2c1, (I2C_ADDRESS << 1), ®Address, 1, ®Data, 1); regAddress = 0x06; HAL_I2C_Mem_Read_IT(&hi2c1, (I2C_ADDRESS << 1), ®Address, 1, aaa[1], 1); Quote Share this post Link to post Share on other sites More sharing options...
dimka76 70 Sunday at 05:06 PM Posted Sunday at 05:06 PM · Report post On 6/8/2025 at 8:05 PM, Александр11111111111 said: А не подскажете команда записи и чтения правильные ? Не знаю, я не использую HAL Quote Share this post Link to post Share on other sites More sharing options...
x893 76 Sunday at 05:13 PM Posted Sunday at 05:13 PM · Report post 7 minutes ago, Александр11111111111 said: Спасибо! вот я тупой, это уже после целого дня голова кругом идёт и пропустил, до этого так и писал) Заработало. А не подскажете команда записи и чтения правильные? regData = 0x0A; regAddress = 0x30; HAL_I2C_Mem_Write_IT(&hi2c1, (I2C_ADDRESS << 1), ®Address, 1, ®Data, 1); regAddress = 0x06; HAL_I2C_Mem_Read_IT(&hi2c1, (I2C_ADDRESS << 1), ®Address, 1, aaa[1], 1); Это зависит от того, какой результат хочется получить Quote Share this post Link to post Share on other sites More sharing options...
Александр11111111111 0 Sunday at 05:23 PM Posted Sunday at 05:23 PM · Report post В даташите датчика написано, что для получения давления нужно в 30 регистр подать команду 0x0A, а потом считать регистры 06, 07, 08. Я подаю, считываю, но там нули. Но хоть откликаться стал regData = 0x0A; regAddress = 0x30; HAL_I2C_Mem_Write_IT(&hi2c1, (I2C_ADDRESS << 1), ®Address, 1, ®Data, 1); regAddress = 0x07; HAL_I2C_Mem_Read_IT(&hi2c1, (I2C_ADDRESS << 1), ®Address, 1, aaa[1], 1); Может там ещё что-то надо сделать? Quote Share this post Link to post Share on other sites More sharing options...
Александр11111111111 0 Sunday at 06:38 PM Posted Sunday at 06:38 PM · Report post 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), ®Address, 1, ®Data, 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), ®Address, 1, aaa[0], 100); regAddress = 0x07; HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), ®Address, 1, aaa[1], 100); regAddress = 0x08; HAL_I2C_Mem_Read_IT(&hi2c1, (0x6D << 1), ®Address, 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), ®Data, 1); //} //void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) //{ // I2C data ready! //} Quote Share this post Link to post Share on other sites More sharing options...
Александр11111111111 0 Sunday at 07:25 PM Posted Sunday at 07:25 PM · Report post Ура!! Заработало!! Вот вариант regData = 0x0A; regAddress = 0x30; HAL_I2C_Mem_Write_IT(&hi2c1, (0x6D << 1), 0x30, 1, ®Data, 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); Quote Share this post Link to post Share on other sites More sharing options...