Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Акселерометр LIS302D

Ср фев 07, 2018 15:38:29

Чтение и запись с авто- инкрементом для - “LIS302DL”

Для – квадратной(IIC & TWI) шины


Что-то похожие на перевод (авто)
(из серии “ – загрузить бревно запросов…”)

I 2 C, встроенный в LIS302DLH, ведет себя как подчиненное устройство и следующее
протокол должен соблюдаться. После условия запуска (ST) отправляется подчиненный адрес, ведомое подтверждение (SAK), передается 8-битный суб-адрес (SUB):
7 LSb представляют собой фактический адрес регистра, в то время как MSB включает автоматическое увеличение адреса. Если MSb поля SUB равно «1», SUB (адрес регистра) автоматически увеличивается до разрешить несколько чтения / записи данных получено.

I 2 C, встроенный в LIS302DLH, ведет себя как подчиненное устройство и следующее
протокол должен соблюдаться. После условия запуска (ST) отправляется подчиненный адрес, ведомое подтверждение (SAK), передается 8-битный суб-адрес (SUB):
7 LSb представляют собой фактический адрес регистра, в то время как MSB включает автоматическое увеличение адреса. Если MSb поля SUB равно «1», SUB (адрес регистра) автоматически увеличивается до разрешить несколько чтения / записи данных.


SAD + Модели чтения / записи

Команда SAD [6: 1] SAD [0] = SA0 R / W SAD + R / W ,
Читать 001100 0 1 00110001 (31 час)
Написать 001100 0 0 00110000 (30 часов)
Читать 001100 1 1 00110011 (33h)
Написать 001100 1 0 00110010 (32 часа)


----

Как это в коде будет выглядеть, а то каждый раз делать
Старт и стоп после каждой операции записи/чтения
Да и по времени очень долго(в тиках).

Код:
void lis302d_init(void){
     
      twi_start();
      twi_wr(lis302d_addrs_w);  // lis302d_addrs_w    0x38
      twi_wr(Ctrl_Reg1);  //0x20
      twi_wr(0b11000101);
      twi_stop();


     twi_start();
      twi_wr(lis302d_addrs_w);
      twi_wr(Ctrl_Reg2); //0x21
      twi_wr(0b01011100); 
      twi_stop();

      twi_start();
      twi_wr(lis302d_addrs_w);
      twi_wr(Ctrl_Reg3); // 0x22
      twi_wr(0b01110111);
twi_stop();

         twi_start();
      twi_wr(lis302d_addrs_w);
         twi_wr( FF_WU_THS_1);  ///порог, в регистре FF_WU_THS_1
         twi_wr(0b00100000);
        twi_stop();

 
         twi_start();
       twi_wr(lis302d_addrs_w);
        twi_wr(FF_WU_THS_2);  // прерывание  FF_WU_THS_2
        twi_wr(0b00100000);
        twi_stop();

        twi_start();
      twi_wr(lis302d_addrs_w); // 0x38 запись
twi_wr(Who_Am_I); 
 twi_start();
twi_wr(lis302d_addrs_r); // 0x39 чтение
           lis302d_id= (twi_rd(0));
twi_stop();


                twi_start();
      twi_wr(lis302d_addrs_w); // 0x38 запись
 
   …(init reg)
  twi_stop();


};



Как будет выгладить код, с запсь/чтение несколько регистров подряд?!
Стандартно как для «ds3231/ds1307» не катит!
Код:
twi_start();
      twi_wr(0xd0);
      twi_wr(0x00);
      twi_start();
      twi_wr(0xd1);

     *sec = bcd2bin(twi_rd(1));   // 1
     *minut = bcd2bin(twi_rd(1)); // 1
     *hour = bcd2bin(twi_rd(1));  // 1
     *day = bcd2bin(twi_rd(1));   // 1
     *date = bcd2bin(twi_rd(1));  // 1
     *month = bcd2bin(twi_rd(1)); // 1
     *year = bcd2bin(twi_rd(0));  //  0 no_ask

      twi_stop();

Не реагирует

Как выполнить этот «SAD + Модели чтения / записи»
???!

Re: Акселерометр LIS302D

Ср фев 07, 2018 18:11:59

Если у Вас пин SDO подключён к земле, то для записи конфигурации начиная с регистра 0х20 с автоматическим инкрементом адреса следует подавать следующие команды:
Код:
twi_start();
      twi_wr(lis302d_addrs_w);  // lis302d_addrs_w    0x38
      twi_wr(Ctrl_Reg1+0x80);  // запись в регистр 0x20 с автоинкрементом адреса
      twi_wr(0b11000101);       // данные для регистра 0х20
      twi_wr(0b01011100);       // данные для регистра 0х21
      и т.д.
      twi_stop();

Чтение регистров Х/Y/Z ускорения с автоматическим инкрементом адреса делается так:
Код:
twi_start();
      twi_wr(lis302d_addrs_w);  // lis302d_addrs_w    0x38
     twi_wr(Х_Reg + 0х80);      // чтение из регистра Х с автоинкрементом адреса
      twi_start();
      twi_wr(lis302d_addrs_r);  // lis302d_addrs_r    0x39
       twi_rd                              // чтение данных
      и т.д.
      twi_stop();

Re: Акселерометр LIS302D

Чт фев 08, 2018 23:27:41

Если у Вас пин SDO подключён к земле, то для записи конфигурации начиная с регистра 0х20 с автоматическим инкрементом адреса следует подавать следующие команды:

да, пин "SDO" на массе

в итоге что получилось
Код:
      twi_start();       
      twi_wr(lis302d_addrs_w);    // lis302d_addrs_r    0x38
      twi_wr(Status_Reg + 0x80);    //
      twi_start();
      twi_wr(lis302d_addrs_r);
      reg_stat = (twi_rd(1));// Status_Reg r 27
      (twi_rd(1));           //  NU
      reg_x = (twi_rd(1));   // Out_X r 29
      (twi_rd(1));           //  NU
      reg_y = (twi_rd(1));   // Out_Y r 2B
      (twi_rd(1));           //  NU
      reg_z = (twi_rd(1));  //  Out_Z r 2D
      (twi_rd(0));           //  NU
       twi_stop(); 


странно, в - даташат-е, нечего не сказа вообще, про такую комбинацию, нужный регистр + 0x80 ...
даже в инете нечего нет , к примеру
http://easystm32.ru/sensors/49-lis302dl
фактически, это перевод.
получается, не все в документации - описали.

ВАМ "Ser60" выражаю - БЛАГОДАРНОСТЬ!

:)

Re: Акселерометр LIS302D

Чт фев 08, 2018 23:41:46

Спасибо, но на самом деле ответ на Ваш вопрос содержится в ДШ акселерометра в параграфе

The I2C embedded inside the LIS302DLH behaves like a slave device and the following
protocol must be adhered to. After the start condition (ST) a slave address is sent, once a
slave acknowledge (SAK) has been returned, a 8-bit sub-address (SUB) is transmitted: the
7 LSb represent the actual register address while the MSB enables address auto increment.
If the MSb of the SUB field is ‘1’, the SUB (register address) is automatically increased to
allow multiple data read/write.


Добавка 0х80 к адресу регистра как раз и устанавливает его MSb в 1, тем самым разрешая автоинкремент адреса.

Re: Акселерометр LIS302D

Сб фев 10, 2018 10:08:20

... но на самом деле ответ на Ваш вопрос содержится в ДШ акселерометра в параграфе
...
Добавка 0х80 к адресу регистра как раз и устанавливает его MSb в 1, тем самым разрешая автоинкремент адреса.


хроническое недосыпание, делает своё черное дело...
(понижение концентрации внимания... :facepalm: )
Ответить