Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

STM32 HAL_I2C_IsDeviceReady
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=19116
Страница 1 от 2

Автор:  VPavlov [ Пон Фев 12, 2024 9:16 pm ]
Заглавие:  STM32 HAL_I2C_IsDeviceReady

Здрасти приятели,

Отново се опитвам да подкарам I2C с разни Нуклео бордове и за пореден път резултатите са плачевни. Този опит опитвам с HAL, гледам един туториал в който тестват нещата с HAL_I2C_IsDeviceReady. Нещата изглеждат по този начин:

Код:
  HAL_StatusTypeDef ret = HAL_I2C_IsDeviceReady(&hi2c1, 0b00110010, 10,100); //MPU9250/6500 address: 0b1101000, StevalMKI218V1 address:0b0011000
  if (ret == HAL_OK)
  {
     printf("The device is ready \n");
  }
  else
  {
     printf("The device is !ready \n");
  }


Това нещо не ще да върне HAL_OK. Как ли не го мъчих,сменях адреси , три устройства, две различни платки с контролери, назначавах други пинове, сменях кабели, замервах връзки, така се закучи значи че като че ли изчерпах всичко за което се сещам. Можете ли да помогнете?
Благодаря предварително.

Автор:  TheWizard [ Пон Фев 12, 2024 9:33 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

а гугъл пита ли ... много постове има за тоз "проблем"

Автор:  VPavlov [ Пон Фев 12, 2024 10:37 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Може би не достатъчно. Срещнах че нямало устройство на адреса и това ме подтикна да пробвам с други устройства. Утре ще го мъча отново.

Автор:  syscop [ Пон Фев 12, 2024 11:16 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Параметърът DevAddress на функцията HAL_I2C_IsDeviceReady не съвпада нито с 0b1101000, нито с 0b0011000 :!:

Автор:  VPavlov [ Вто Фев 13, 2024 10:03 am ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Здрасти Syscop, какво пропускам? Имам 7 битов адрес + бит за четене или писане. В документацията на HAL дават следното:

Цитат:
DevAddress: Target device address: The device 7 bits address value in datasheet must be shifted to the
left before calling the interface.


Дали имаш предвид предвид че не са шифтнати? Ако е така му давам директно 8 битов адрес. Между другото в туториала беше със шифтване, пробвах и с това. Може би съм объркал нещата със смятането на битове. Ще пробвам отново със шифтване или с калкулатор. Като цяло логиката ми е такава: Ако имам адрес: 1101000, от това подавам 1101000<<1 за четене и (1101000<<1) +1 за писане или директно 1101000 или 1101001.

Автор:  syscop [ Вто Фев 13, 2024 10:38 am ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Пример:

Код:
#define MPU9250_I2C_ADDRESS  0b01101000
....
HAL_StatusTypeDef ret = HAL_I2C_IsDeviceReady(&hi2c1, MPU9250_I2C_ADDRESS << 1, 10,100);
...


Вероятността да сбъркаш е по-малка.
Погледни реда, в който викаш функцията HAL_I2C_IsDeviceReady - параметърът DevAddress е различен от този в коментарите след нея, т.е. имаш три различни числа. Кое е вярното?

Автор:  VPavlov [ Вто Фев 13, 2024 10:46 am ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Благодаря, ще го направя както показваш, в действителност внася организираност. Мисля че използваният адрес е различен е защото последно пробвах с трето устройство, което не бях записал в коментарите. Но сега ще се концентрирам само върху MPU-9250/6500.

Автор:  TheWizard [ Вто Фев 13, 2024 10:54 am ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

за SPI & I2C е добре да имаш осцилоскоп под ръка ... никога не тръгват от ряз
та почваш от там ... имаш/нямаш сигнали - объркал пиновете
грозни форми - забравил и сгрешил пъл-ъп, предава - не приема, все някой бит/число объркано

но винаги се почва с Гугъл :)

Автор:  VPavlov [ Вто Фев 13, 2024 11:42 am ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Прав си магьоснико, ама нямам. Ще купя един при първа възможност. Отдавна осъзнах нуждата. Гугъла го ползвам и бота и документация, уж се опитвам да правя нещата както трябва, без да я карам "през просото".

Бях поръчал две устройства защото имам лош спомен от дефектно или повредено от мен устройсто. Току що запоих новото и разгеле върна OK. По едно време вчера бях го захранил с 5V, по невнимание, така че може да съм повредил предното кит-че, но определено не работи.

Автор:  ToHu [ Вто Фев 13, 2024 8:07 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Да за тия интерфейси се иска гледане, ако не скоп някакъв евтин логически анализатор, има много. Много често проблема е в имплементацията, понякога в куцо описание, но резултата е все един и същ, я адреса в различен, я режима, и това са неща които се виждат веднага.

Автор:  RM [ Съб Фев 17, 2024 8:25 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

примерно за LM75A
#define MY_I2C hi2c2
#define LM75_ADDRESS ((0x48 | 0x00) << 1 )
uint8_t reg
Първо давам
MX_I2C2_Init();

HAL_I2C_Master_Transmit( &MY_I2C, LM75_ADDRESS, &reg, 1, 500 ); ////////////// HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c,
////////////// uint16_t DevAddress,
////////////// uint8_t *pData,
//////////////// uint16_t Size,
//////////////// uint32_t Timeout);

Автор:  RM [ Нед Май 05, 2024 7:37 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

Да питам за STM32F103C6T6
Правя си една платка да ми следи едни сигнали.
Имам 3 масива uint16_t по 820 елемента.
Те съдържат измервания на 3 ADC канала в разстояние на 42mkS по 820 измервания на канал.
Трябва да ги пратя през USB на пакети uint8_t 64 байта. В mine.c изпращането на репорта е ОК. Но когато функцията за изпращане на пакета се вика в друга моя функция, нещата се омазват. Усетих се че е от размера на стека. В линкера промених Stack Size от 0x400 на 0x500.
И нещата се оправиха. но не ми е много ясно какво стана. Какво означава това съпоставено с дълбочината на стека Или с броя на запомнените Пр. адреси и препълване на стека . 0x400 или 0x500 какво точно променя ???

Автор:  MYXATA [ Нед Май 05, 2024 8:19 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

RM написа:
Да питам за STM32F103C6T6
Правя си една платка да ми следи едни сигнали.
Имам 3 масива uint16_t по 820 елемента.
Те съдържат измервания на 3 ADC канала в разстояние на 42mkS по 820 измервания на канал.
Трябва да ги пратя през USB на пакети uint8_t 64 байта. В mine.c изпращането на репорта е ОК. Но когато функцията за изпращане на пакета се вика в друга моя функция, нещата се омазват. Усетих се че е от размера на стека. В линкера промених Stack Size от 0x400 на 0x500.
И нещата се оправиха. но не ми е много ясно какво стана. Какво означава това съпоставено с дълбочината на стека Или с броя на запомнените Пр. адреси и препълване на стека . 0x400 или 0x500 какво точно променя ???

Ми що не направиш един кръговнбуфер. Интам да буташ от една страна данните от ацп , а от друга да четеш и да пращаш по усб?
Така няма дастека няма да има нужда да го уголемяваш илибдантинендинамичен..

Автор:  iss [ Нед Май 05, 2024 10:54 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

RM написа:
... 0x400 или 0x500 какво точно променя ???


Препълване стека може да се получи ако виканите функции използват повечко локални променливи.
Например:
Код:
void A(void)
{
   uint8_t buf[256];
   ....
}

void B(void)
{
   uint8_t buf[256];
   ....
  A();
}

Тук ще трябва стек поне 512 + 8 байта.

Автор:  RM [ Пон Май 06, 2024 2:21 pm ]
Заглавие:  Re: STM32 HAL_I2C_IsDeviceReady

iss написа:
RM написа:
... 0x400 или 0x500 какво точно променя ???


Препълване стека може да се получи ако виканите функции използват повечко локални променливи.
Например:
Код:
void A(void)
{
   uint8_t buf[256];
   ....
}

void B(void)
{
   uint8_t buf[256];
   ....
  A();
}

Тук ще трябва стек поне 512 + 8 байта.




Тука вече съвсем не ме иска
Код:
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t tx_buffer[64];      
uint8_t report_buffer[64];      
uint8_t flag = 0;         
uint8_t USBflag_rx = 0;         
char msgbuf[64];     //AO!

uint8_t tmp[64];
uint16_t tx_buffer1[32];
uint16_t input_array[832];
uint8_t output_arrays[25][64];


uint8_t ADC_FLAG;
#define TRUE 1
#define FALSE 0
#define adc_buff 832
uint16_t adc1_buff[adc_buff];
uint16_t adc2_buff[adc_buff];
uint16_t adc3_buff[adc_buff];
uint16_t adc_counter=0;
uint8_t   ADC_conversion_START=1;
/* USER CODE END PV */


/* USER CODE END 0 */



Промяната на реда 0х400 на 0х500 не промени нещата ... нещо се бях заблудил.

Код:
Stack_Size      EQU     0x400   

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp




Пуснах симулация на това което искам да следя ... оказа се че е невъзможно според познанията ми.
Измерване на нарастване на фронт от 0V до 2.84V с продължителност 1.32 микроСекунди !!!

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/