ICM-20948 How to use the DMP?

By bosco , 27 February 2019

Folks,

We want to use the ICM-20948 on a new project and use the DMP. However, there seems to be zero documentation on how to do this. There's nothing about how to program it, once it is programmed, then how you get information out.

The Atmel firmware in one of the dev kits seems to suggest you have to load an image into the DMP and I think I read somewhere that the code memory for said DMP is volatile, so that would make sense.

However, the image that comes with the Atmel kit has no API whatsoever as fas as I can make out. There's zero about whether you should write your own DMP code, whether you even can, let alone what compiler you'd need.

So, can anyone help please?

1. Is the image that comes with the Atmel dev kit the only image you'll ever need?
2. If so, how do you use this image?
3. If not, how do you write code for the DMP.

Many thanks,

Rob

rjadams

7 years ago

Just here to bump this thread. I also bought the ICM-20948 DK because of how proudly InvenSense was touting the helpfulness of the DMP, and now that I have the board I have no idea how to enable it or alter it. The lack of explanatory documentation/user guides/examples has been frustrating.

phpbb Post ID
37443

alisninomia

6 years 8 months ago

Just bumping the thread too. The lack of documentation on this is unbelievable. The magnetometer values don't even seem to go into the DMP properly but there's no way to know because even the DMP application note covers nothing about configuring the magnetometer...

phpbb Post ID
37548

mafsar

6 years 6 months ago

Just started using DK-20948 Dev board. After enabling sensors using "enable_sensor" command through UART terminal window, seems like it requires use of window command line to get sensor data according to eMD_Software_Guide_ICM20948.pdf. But "sensor_cli.exe" command times out. Anyone encountered such issue?

-afsar

phpbb Post ID
37632

john3909

6 years 4 months ago

It seems like Sensor-cli is using a different protocol version to the one used on the Nucleo-F411RE board. I added code to print out the bytes received from sensor-cli on the Nucleo board and here is what I get:

[I] ###################################
[I] # 20948 example #
[I] ###################################
[I] Open I2C serial interface
[I] ICM WHOAMI=ea
[I] Setting-up ICM device
[I] Booting up Icm20948...
[V] Reading WHOAMI...
[I] WHOAMI value: 0xea
[V] Putting Icm20948 in sleep mode...
[V] We're good to go !
[I] Load DMP3 image
[I] uart_getc=0x55
[I] uart_getc=0xaa
[I] uart_getc=0xaa
[I] uart_getc=0x3
[I] uart_getc=0x22
[E] DynProtocol: Invalid group ID
[D] DynProtocol_processPktByte(22) returned -1
[I] uart_getc=0x0
[E] DynProtocol: Invalid group ID
[D] DynProtocol_processPktByte(00) returned -1
[I] uart_getc=0x0
[E] DynProtocol: Invalid group ID
[D] DynProtocol_processPktByte(00) returned -1
[I] uart_getc=0x55
[E] DynProtocol: Invalid group ID
[D] DynProtocol_processPktByte(55) returned -1
[I] uart_getc=0x55
[E] DynProtocol: Invalid group ID
[D] DynProtocol_processPktByte(55) returned -1
[I] uart_getc=0x2
[E] DynProtocol: Invalid group ID
[D] DynProtocol_processPktByte(02) returned -1
[I] uart_getc=0x0
[E] DynProtocol: Invalid group ID
[D] DynProtocol_processPktByte(00) returned -1
[I] uart_getc=0x3
[I] uart_getc=0x12
[D] DeviceEmdWrapper: received command setup(SENSOR_RESERVED)
[I] Booting up Icm20948...
[V] Reading WHOAMI...
[I] WHOAMI value: 0xea
[V] Putting Icm20948 in sleep mode...
[V] We're good to go !
[W] No bias values retrieved from NV memory !

The groupID on the Nucleo board is 0x3, so not sure why it is interpreting 0x22 as a groupID.

Regards,
John

phpbb Post ID
37738

yomuevansgmailcom

4 years 10 months ago

/*
* CommandHandlerTaskMain - Task that monitors the UART
*/
static void CommandHandlerTaskMain(void * arg){
(void)arg;

int byte;
do {
byte = EOF;
//printf("/n",byte);
//usart_serial_putchar(byte, *ptr);
//INV_MSG(INV_MSG_LEVEL_INFO, byte);
__disable_irq();

if(!RingByteBuffer_isEmpty(&uart_rx_rb)) {
byte = RingByteBuffer_popByte(&uart_rx_rb);
INV_MSG(INV_MSG_LEVEL_INFO,"0x%02x", byte);
}
__enable_irq();

if(byte != EOF) {
DynProTransportUart_rxProcessByte(&transport, (uint8_t)byte);

}
} while(byte != EOF);
}

this is how i have been printing mine

phpbb Post ID
38994

yomuevansgmailcom

4 years 10 months ago

command to start and stop gyroscope data

phpbb Post ID
38995

yomuevansgmailcom

4 years 10 months ago

DynProtocolTransportUart.c seems to describe this weird protocol commands

phpbb Post ID
38997

yomuevansgmailcom

4 years 10 months ago

have a look at that https://github.com/Dotolie/libIDD/blob/master/bin/example.c

phpbb Post ID
39000

chaitanyaismar…

3 years 9 months ago

Hi, all and the Invensense team,
is ICM20948 obsoleted? it is mentioned as NRND so it is not recommended?
is there another IC with 9DOF with inbuilt fusion?
is it possible to use some TDK fusion software library + Accel+Gyro one IC + Mag IC available solution?

phpbb Post ID
39492

mhastingsolyseuscom

3 years 8 months ago

Looks like Invensense has a policy of no customer support whatsoever

phpbb Post ID
39507

mhastingsolyseuscom

3 years 8 months ago

I would also like to know what is the status of this part. It's marked as NRND by some suppliers, and there's no information about production, no information from Invensense

phpbb Post ID
39509

chaitanyaismar…

3 years 8 months ago

It was mentioned by the technical team that ICM20948 is obsolete.
Not only Invensense but many leading IMU companies obsolete 9DOF/10DOF, Reasons them are many
- Nonavailability of mag sensors
- Chip fab issues.. etc.
We are moving to the 2 chip solutions, But still inbuilt fusion and calibration seems unavailable from most IMUs.
this going to effect global application developments a lot.

phpbb Post ID
39510
phpbb Topic ID
37431