|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 2:05 pm
|
Страница 1 от 1
|
[ 5 мнения ] |
|
STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
| Автор |
Съобщение |
|
VPavlov
Ранг: Популярен
Регистриран на: Съб Апр 01, 2023 9:59 am Мнения: 302
|
 STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
Здрасти, Попривърших едни серии с туториали за HAL и реших да пробвам нещо сам но удрям на камък. Опитвам се да установя връзка с AIS2ih качено на STEVAL-MKI218V1 с Nucleo F401RE. Вземам 7 битов адрес от документацията на AIS2ih и го ползвам в HAL_I2C_Mem_Read и HAL_I2C_Master_Transmit, като до колкото разбрах от Бота последния бит (за четене и писане) бил добавян от тези функции. В ST писаха че адресът най-вероятно е 0b110000 с който пробвах но също без резултат. Опитвам се да пиша в два регистъра, като по този начин да стартирам сензора и да го преведа в работен режим (CTR1, CTR6) тези ги взех от предложените примери за работа с този сензор. На този етап би трябвало да мога да прочета регистри и ползвам HAL_I2C_Mem_Read да прочета един определен регистър "Who_Am_I", просто колкото да видя че нещо работи. Записвам стойността на регистъра в device_id променлива, която стои празна при стартиране на програмата. Така че изглежда нищо не се случва и съм тотално блокирал, въобще не ми идва на идея как да подходя. Ще съм благодарен за всякакви съвети. Искам да ви попитам също за мнение отностно тая HAL история. Дали се занимавате професионално с нея или просто се програмира чрез писане директно на регистрите, може би с CMSIS? Прилагам кода и снимка на връзките. Благодаря!  |  |  |  | Код: #include <stdio.h> #include "stm32f4xx_hal.h" #include "uart.h" #include "adc.h"
#define DEVICE_ADDR_I2C 0011000
#define CTR1_Reg 0x20 #define CTR6_Reg 0x25 #define Who_Am_I_Reg 0x0F
I2C_HandleTypeDef ais2ih_i2c1;
void i2c1_init(void);
void adxl_write (uint8_t reg, uint8_t value); void adxl_read_values (uint8_t reg);
void ais2ih_read_register (uint8_t reg); void ais2ih_init(void);
uint8_t data_rec[8]; uint8_t device_id[1];
int main() {
HAL_Init(); i2c1_init(); ais2ih_init();
while(1) { ais2ih_read_register (Who_Am_I_Reg); } }
void adxl_write (uint8_t reg, uint8_t value) { uint8_t data[2]; data[0] = reg; data[1] = value; HAL_I2C_Master_Transmit (&ais2ih_i2c1, DEVICE_ADDR_I2C, data, 2, 100); }
void ais2ih_init(void) { //1. Turn ON the ACC adxl_write (CTR1_Reg, 0x64);
//2. Set up work mode adxl_write (CTR6_Reg, 0x04); } void ais2ih_read_register (uint8_t reg_adress) { HAL_I2C_Mem_Read (&ais2ih_i2c1, DEVICE_ADDR_I2C, reg_adress, I2C_MEMADD_SIZE_8BIT, (uint8_t *) device_id, 1, 100); }
void i2c1_init(void) { /* PB8 ------> I2C1_SCL PB9 ------> I2C1_SDA */
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//Configure I2C
__HAL_RCC_I2C1_CLK_ENABLE();
ais2ih_i2c1.Instance = I2C1; ais2ih_i2c1.Init.ClockSpeed = 400000; ais2ih_i2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; ais2ih_i2c1.Init.OwnAddress1 = 0; ais2ih_i2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; ais2ih_i2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; ais2ih_i2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; ais2ih_i2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&ais2ih_i2c1);
}
void SysTick_Handler(void) { HAL_IncTick(); }
|  |  |  |  |
|
| Сря Авг 09, 2023 5:12 pm |
|
 |
|
ig_ivanov
Ранг: Професионалист
Регистриран на: Съб Май 21, 2016 9:47 pm Мнения: 577 Местоположение: Бургас
|
 Re: STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
Аз не разбирам много от такива сензори, ама все пак: Pull-up резисторите (на SCL, SDA и CS), дето са вградени, ми се струват много мижави. Според мен е добре да се сложат външни. Нивото на CS определя режима на работа- SPI или I2C. За второто трябва да има твърдо високо ниво. Има два варианта на адреси, които чипа чака- 0x30/0x31 и 0x32/0x33. На снимката не се вижда кое е отбелязано. Не е ясно какво прави библиотеката за връзка с чипа- дали преди предаване измества с един бит адреса и после добавя бита за четене/запис или на самия адрес просто го добавя/изчиства този бит без да мести нещо.
|
| Сря Авг 09, 2023 11:08 pm |
|
 |
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 3:18 pm Мнения: 363 Местоположение: Varna
|
 Re: STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
Според DS-та, в тази конфигурация адресът трябва да е 0x32 (или 0b00110010 ). Това според page 3/Table 1 и page 25/Table 15.
едит HAL_I2C_Master_Transmit не шифтва адреса и затова трябва и се подаде 0x32 а не 0x19.
едит 2 Така го виждам в момента. Не съм ползвал този сензор, нито HAL-а на ST.
|
| Чет Авг 10, 2023 12:19 am |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
 Re: STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
Провери няма ли да стане? За четенето по същия начин.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!
|
| Чет Авг 10, 2023 9:14 am |
|
 |
|
VPavlov
Ранг: Популярен
Регистриран на: Съб Апр 01, 2023 9:59 am Мнения: 302
|
 Re: STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
Много благодаря на всички отзовали се! Имам един тъп въпрос: 0b означава за компилатора двоично число подобно на 0x или друго? Изглежда проблемът е бил точно в адреса. След като го замених с 0b00110010 буферната ми променлива започна да чете стойности. Последните са малко странни но все пак е в пъти по-добре от нищото, което получавах. Странни са защото визуализира 68, което в двоичен код е 01000100 - стойността по подразбиране на въпросния WHO_AM_I регистър, иначе би трябвало да е тази: 00001111. Това ме навежда на мисълта че може би нещо инициализацията ми куца. Прегледах отново даташеета и установих че стойността за четене е 00110011 (33h), а за писане 00110010 (32h) така ги зададох отделно: и съответно във функциите:  |  |  |  | Код: HAL_I2C_Master_Transmit (&ais2ih_i2c1, DEVICE_ADDR_I2C_w, data, 2, 100);
HAL_I2C_Mem_Read (&ais2ih_i2c1, DEVICE_ADDR_I2C_r, reg_adress, I2C_MEMADD_SIZE_8BIT, (uint8_t *) device_id, 1, 100); |  |  |  |  |
Сега изглежда че може да чете и пише в регистри. Трябва да черпя! Последен въпрос, какво ползваш, как програмираш? Директно пишеш в регистрите? За адресите си напълно прав. За резисторите, сигурно пак. Но целта ми сега е да се науча да ги програмирам тия работи. Ако успея да стигна до там че да се опитам да го направя на една платка, ще си припомня твоя съвет! Няма библиотека за връзка. Тоест има, но не я ползвам. Сега се опитвам да се науча да направя такава. Ами да! Имаше такъв подход в туториалите беше за връзка с труг тип сензор: Пробвах го и изглежда че работи. Отново благодаря за съветите!
|
| Чет Авг 10, 2023 5:26 pm |
|
|
|
Страница 1 от 1
|
[ 5 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|