dmp load failed, wrong banksel and data shifted

By boubouboy , 18 November 2015

hi everyone,

I try to load the dmp in the mpu6050, but i have a problem. the values that are write and values read back are different.
It is is not a random error, in fact the values read back are shift by 1 register.
When i try to read the banksel, i write 0x00, 0x00, and i read back 0x00, 0x01, and at each increment the banksel register is shifted by 1.
... write 0x00, 0x10, read 0x00 0x11 and so..

In addition to this error the dmp data write and read are shift.

MCU6050Mgr :: write value: 0 read value: 215
MCU6050Mgr :: write value: 0 read value: 0
MCU6050Mgr :: write value: 112 read value: 0
MCU6050Mgr :: write value: 0 read value: 112
MCU6050Mgr :: write value: 0 read value: 0
MCU6050Mgr :: write value: 0 read value: 0
MCU6050Mgr :: write value: 0 read value: 0
MCU6050Mgr :: write value: 36 read value: 0
MCU6050Mgr :: write value: 0 read value: 36
MCU6050Mgr :: write value: 0 read value: 0
MCU6050Mgr :: write value: 0 read value: 0
MCU6050Mgr :: write value: 2 read value: 0
MCU6050Mgr :: write value: 0 read value: 2
MCU6050Mgr :: write value: 3 read value: 0
MCU6050Mgr :: write value: 0 read value: 3
MCU6050Mgr :: write value: 0 read value: 0

I try to use the mpu6050 from a raspberry pi, and i have adapte the code from the motiondriver 6.12 to do it. This is the code to load the dmp.
The i2c method are used from i2clib-dev.

mpu_load_firmware{
const uint16_t sStartAddress = 0x0400;
const unsigned char DMP_SAMPLE_RATE = 200;

int error = 0;
const uint16_t LOAD_CHUNK = 16;
uint8_t length =0;;
uint8_t cur[LOAD_CHUNK], tmp[2];

for (uint16_t i = 0; i < DMP_CODE_SIZE; i=length+i)
{
if(LOAD_CHUNK < DMP_CODE_SIZE - i)
{
length = LOAD_CHUNK;
}
else
{
length = DMP_CODE_SIZE - i;
}

error = mpu_write_mem(i, length, &firmware[i]);
error = mpu_read_mem(i, length, cur);

if (0 != memcmp(firmware+i, cur, length))
{
LOG_ERROR("MCU6050Mgr :: mpu_load_firmware() read values and write values are different");
for(int k=0; k<length; k++)
{
printf("MCU6050Mgr :: write value: %d\t\tread value: %d\n", firmware[i+k], cur[k]);
}

error = 1;
}
}

if(error == 0)
{
tmp[0] = sStartAddress >> 8;
tmp[1] = sStartAddress & 0xFF;

uint8_t mcu6050_ra_dmp_cfg1 = MPU6050_RA_DMP_CFG_1;
uint8_t n = 2;
_rCommunicationMgr.writeBytes(addressMCU, mcu6050_ra_dmp_cfg1, n, tmp);

}
return -error;
}

mpu_write_mem{
unsigned char tmp[2];
unsigned char tmp2[2];
unsigned int bankSize= 256;
int16_t error = 0;
int16_t globalError = 0;

tmp[0] = static_cast<unsigned char>(mem_addr >> 8);
tmp[1] = static_cast<unsigned char>(mem_addr & 0xFF);

tmp2[0] =0xFF;
tmp2[1] =0xFF;
uint16_t tmp3 =0xFF;

uint8_t addressMCU6050 = 0x68;

/* Check bank boundaries. */
if (tmp[1] + length < bankSize)
{
//changement de bank ;
uint8_t addressMCU6050 = 0x68;
uint8_t mcu6050_ra_bank_sel = MPU6050_RA_BANK_SEL;
uint8_t n = 2;

_rCommunicationMgr.readBytes(addressMCU6050, mcu6050_ra_bank_sel, n, tmp2);
printf("readBytes before: %d %d\n", tmp2[0], tmp2[1]);

_rCommunicationMgr.writeBytes(addressMCU6050, mcu6050_ra_bank_sel, n, tmp);

_rCommunicationMgr.readBytes(addressMCU6050, mcu6050_ra_bank_sel, n, tmp2);
printf("writeBytes: %d%d\t\t readBytes: %d%d\n", tmp[0], tmp[1], tmp2[0], tmp2[1]);


if(globalError == 0)
{
uint8_t mcu6050_ra_mem_r_w = MPU6050_RA_MEM_R_W;
_rCommunicationMgr.writeBytes(addressMCU6050, mcu6050_ra_mem_r_w, length, data);
globalError = error + globalError;
}
}
else
{
globalError = 1;
}
return -globalError;
}

mpu_read_mem{
unsigned char tmp[2];
unsigned char tmp2[2];
uint16_t bankSize= 256;
int16_t error = 0;
int16_t globalError = 0;

tmp[0] = static_cast<unsigned char>(mem_addr >> 8);
tmp[1] = static_cast<unsigned char>(mem_addr & 0xFF);
printf("mem_addr: %d\n", mem_addr);
printf("tmp apres cast: %d %d\n", tmp[0], tmp[1]);

tmp2[0] =0xFF;
tmp2[1] =0xFF;
uint16_t tmp3 = 0xFF;

/* Check bank boundaries. */

if (tmp[1] + length < bankSize)
{
//changement de bank
uint8_t addressMCU6050 = 0x68;
uint8_t mcu6050_ra_bank_sel = MPU6050_RA_BANK_SEL;
uint8_t n = 2;


_rCommunicationMgr.readBytes(addressMCU6050, mcu6050_ra_bank_sel, n, tmp2);
printf("readBytes before: %d %d\n", tmp2[0], tmp2[1]);

_rCommunicationMgr.writeBytes(addressMCU6050, mcu6050_ra_bank_sel, n, tmp);
_rCommunicationMgr.readBytes(addressMCU6050, mcu6050_ra_bank_sel, n, tmp2);
printf("writeBytes: %d %d\t\treadBytes: %d %d\n", tmp[0], tmp[1], tmp2[0], tmp2[1]);

/*
//mem_r_w
for(unsigned char i=0; i<length; i++)
{
data[i] = readDataMCU6050(mcu6050Handler, MPU6050_RA_MEM_R_W);
}
*/
uint8_t mcu6050_ra_mem_r_w = MPU6050_RA_MEM_R_W;
_rCommunicationMgr.readBytes(addressMCU6050, mcu6050_ra_mem_r_w, length, data);

}
else
{
globalError = 1;
}
return -globalError;
}

phpbb Topic ID
31373