Shiftanje pointerjev

programski jeziki in programiranje

Moderator: tilz0R

Shiftanje pointerjev

OdgovorNapisal/-a MocnikG » 25 Apr 2019, 13:10

Zdravo,

ker verjamem da so ti driverji bolje napisani kot moji, bi jih rad uporabil kot celoto.
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/master/lsm9ds1_STdC

Iz primera, bi rad predelal funkcije platform_read in platform_write, tako, da bo delovala s funkcijami na nRF čipu. Ker pa v to funkcijo prileti podatek, ki je dolg 8bit (7 bit + R/W 1b), jaz pa moram v mojo funkcijo poslati samo 7 LSB bitov. saj mi moja funkcija sama doda R/W bit.

Koda: Izberi vse
static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,
                             uint16_t len)
{
  uint8_t *i2c_address = handle;
  HAL_I2C_Mem_Read(&hi2c1, *i2c_address, reg,
                   I2C_MEMADD_SIZE_8BIT, bufp, len, 1000);
  return 0;
}


zgoraj je primer od ST-ja, ki imajo funkcijo HAL_i2C_MEM_READ, jaz pa imam funkcijo nrf_drv_twi_tx, ki prejme v argumente:
Koda: Izberi vse
[in]   p_instance   TWI instance.
[in]   address   Address of a specific slave device (only 7 LSB).
[in]   p_data   Pointer to a transmit buffer.
[in]   length   Number of bytes to send.
[in]   no_stop   If set, the stop condition is not generated on the bus after the transfer has completed successfully (allowing for a repeated start in the next transfer).


z ustrezno predelavi pridem do funkcije kot je STM hal.

Vendar imam težave ker bi rad skozi funkcijo platform_read speljal podatek recimo reg, ter ga preden ga dam v nrf_drv_twi_tx zashiftal v desno (right logical bitwise shift) z >>.

No in nekaj takšnega sem naredil, vendar pravzaprav ne znam ustrezno zashiftati pointerja, ker shiftam vse ostalo le vrednosti ne. Za začetek glejmo samo data ne bufp, ker še nisem tako daleč. :D
Rezultat compilerja je:
Koda: Izberi vse
passing argument 3 of ‘nrf_drv_twi_tx’ makes pointer from integer without a cast [-Wint-conversion]

Moja funkcija:
Koda: Izberi vse
static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp, uint16_t len){
  uint8_t *i2c_address = handle;
  ret_code_t err_code;
  uint8_t data = reg;
  data = data >> 1;
  err_code = nrf_drv_twi_tx(&m_twi, *i2c_address, data, 1, true);
    if(err_code == NRF_SUCCESS){
      NRF_LOG_INFO("Device Address and Register Address;
    }
    NRF_LOG_FLUSH();

    err_code = nrf_drv_twi_rx(&m_twi, *i2c_address, bufp, sizeof(bufp));
    if (err_code == NRF_SUCCESS){
      NRF_LOG_INFO("The Register read = 0x%x", bufp);
    }
    NRF_LOG_FLUSH();
  return 0;
}
*Sent*from*my* iPhone.
*Sent*from*my* Linux.
*Sent*from*my* room.
Uporabniški avatar
MocnikG
 
Prispevkov: 447
Pridružen: 18 Maj 2015, 18:56
Kraj: Koroška - MB - CE
Zahvalil se je: 40 krat
Prejel zahvalo: 65 krat
Uporabnika povabil: s55ei
Število neizkoriščenih povabil: 6

Re: Shiftanje pointerjev

OdgovorNapisal/-a peterp » 25 Apr 2019, 14:38

Manjka ti & pred data? Torej
Koda: Izberi vse
err_code = nrf_drv_twi_tx(&m_twi, *i2c_address, &data, 1, true);
peterp
 
Prispevkov: 562
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 127 krat
Prejel zahvalo: 87 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 89


Vrni se na Software

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 0 gostov