Отговори на тема  [ 5 мнения ] 
STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 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();
}



Прикачени файлове:
Vrazki.jpg
Vrazki.jpg [ 1.16 MiB | Прегледано 2437 пъти ]
Сря Авг 09, 2023 5:12 pm
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Съб Май 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
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
Провери

Код:
HAL_I2C_Master_Transmit (&ais2ih_i2c1, DEVICE_ADDR_I2C << 1, data, 2, 100);


няма ли да стане? За четенето по същия начин.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Чет Авг 10, 2023 9:14 am
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: STEVAL-MKI218V1 + Nucleo F401RE I2C комуникация
Много благодаря на всички отзовали се!

Stoimen написа:
Според DS-та, в тази конфигурация адресът трябва да е 0x32 (или 0b00110010 ). Това според page 3/Table 1 и page 25/Table 15.

едит
HAL_I2C_Master_Transmit не шифтва адреса и затова трябва и се подаде 0x32 а не 0x19.

едит 2
Така го виждам в момента. Не съм ползвал този сензор, нито HAL-а на ST.


Имам един тъп въпрос: 0b означава за компилатора двоично число подобно на 0x или друго?
Изглежда проблемът е бил точно в адреса. След като го замених с 0b00110010 буферната ми променлива започна да чете стойности. Последните са малко странни но все пак е в пъти по-добре от нищото, което получавах. Странни са защото визуализира 68, което в двоичен код е 01000100 - стойността по подразбиране на въпросния WHO_AM_I регистър, иначе би трябвало да е тази: 00001111. Това ме навежда на мисълта че може би нещо инициализацията ми куца. Прегледах отново даташеета и установих че стойността за четене е 00110011 (33h), а за писане 00110010 (32h) така ги зададох отделно:
Код:
#define   DEVICE_ADDR_I2C_w     0b00110010
#define   DEVICE_ADDR_I2C_r      0b00110011


и съответно във функциите:

Код:
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);


Сега изглежда че може да чете и пише в регистри. Трябва да черпя!
Последен въпрос, какво ползваш, как програмираш? Директно пишеш в регистрите?

ig_ivanov написа:
Аз не разбирам много от такива сензори, ама все пак:
Pull-up резисторите (на SCL, SDA и CS), дето са вградени, ми се струват много мижави. Според мен е добре да се сложат външни. Нивото на CS определя режима на работа- SPI или I2C. За второто трябва да има твърдо високо ниво.
Има два варианта на адреси, които чипа чака- 0x30/0x31 и 0x32/0x33. На снимката не се вижда кое е отбелязано. Не е ясно какво прави библиотеката за връзка с чипа- дали преди предаване измества с един бит адреса и после добавя бита за четене/запис или на самия адрес просто го добавя/изчиства този бит без да мести нещо.

За адресите си напълно прав. За резисторите, сигурно пак. Но целта ми сега е да се науча да ги програмирам тия работи. Ако успея да стигна до там че да се опитам да го направя на една платка, ще си припомня твоя съвет! Няма библиотека за връзка. Тоест има, но не я ползвам. Сега се опитвам да се науча да направя такава.

syscop написа:

Провери

Код:
Код:
HAL_I2C_Master_Transmit (&ais2ih_i2c1, DEVICE_ADDR_I2C << 1, data, 2, 100);



няма ли да стане? За четенето по същия начин.


Ами да! Имаше такъв подход в туториалите беше за връзка с труг тип сензор:

Код:
#define AIS2IH_I2C_ADDR     0xC<<1


Пробвах го и изглежда че работи.

Отново благодаря за съветите!


Чет Авг 10, 2023 5:26 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни