User Tools

Site Tools


doc:crazyflie:crtp:mem

This is an old revision of the document!


Memory access

Memory access is not used for the Crazyflie Nano Quadcopter, it's currently only implemented in the Crazyflie 2.0. Using the memory access gives the possibility to:

  • Get information about which memories are available
  • Read/write/erase memories

Currently the following memories are supported:

  • Crazyflie 2.0 onboard EEPROM
  • Crazyflie 2.0 expansion board 1-wire memories

There's more information available for how the EEPROM is structured and how the 1-wire memories work and are structured.

Logical flow

Getting information and reading/writing the memories is optional for the clients, but the -Crazyflie Python Client- always downloads information about the memories on connect.

Communication protocol

The memory port uses 3 different channels:

Port Channel Function
4 0 Get information about amount and types of memory as well as erasing
4 1 Read memories
4 2 Write memories

Channel 0: Info/settings

This channel is used to get the number of memories present, information about the memories and the possibility to mass erase memories. The first byte of every packet is a command byte:

Command byte Command Operation
1 GET_NBR_OF_MEMS Get the number of memories
2 GET_MEM_INFO Get information about a memory
3 SET_MEM_ERASE Mass erase a memory

GET_NBR_OF_MEMS

This command is used to get the number of memories present.

The request from host to Crazyflie:

Byte Field Value Length Comment
0 GET_NUMBER_OF_MEMS 0x01 1 The command byte

Reply from Crazyflie to host:

Byte Field Value Length Comment
0 GET_NUMBER_OF_MEMS 0x01 1 The command byte
1 Number of memories 1 The number of memories preset (all types)

Example where there are 3 memories present on the Crazyflie:

Host-to-Crazyflie: <port/chan> 0x01
Crazyflie-to-Host: <port/chan> 0x01 0x03

GET_MEM_INFO

This command is used to get information about a memory give it's id. The id of memories is sequential and is from 0 to one less than the returned number of memories from GET_NUMBER_OF_MEMS.

The request from host to Crazyflie:

Byte Field Value Length Comment
0 GET_MEM_INFO 0x02 1 The command byte
1 MEM_ID 1 A memory id that is 0 ⇐ id < NBR_OF_MEMS

Reply from Crazyflie to host if the id is valid:

Byte Field Value Length Comment
0 GET_MEM_INFO 0x02 1 The command byte
1 MEM_ID 1 The memory id
2 MEM_TYPE 1 The memory type (see below)
3 MEM_SIZE 4 The size in bytes of the memory
7 MEM_ADDR 8 The address of the memory (only valid for 1-wire memories)

Where the MEM_TYPE field is:

MEM_TYPE Memory type Comment
0 I2C
1 1-wire

Reply from Crazyflie to host if the id is not valid:

Byte Field Value Length Comment
0 GET_MEM_INFO 0x02 1 The command byte
1 MEM_ID 1 The memory id

Example of requesting the information for a 1-wire memory with MEM_ID=1, MEM_SIZE=112bytes, MEM_ADDR=0x1234567890ABCDEF

Host-to-Crazyflie: <port/chan> 0x02 0x01 0x01
Crazyflie-to-Host: <port/chan> 0x02 0x01 0x01 0x70 0x00 0x00 0x00 0xEF 0xCD 0xAB 0x90 0x78 0x56 0x34 0x12

Example of requesting the information for a memory index that is not valid

Host-to-Crazyflie: <port/chan> 0x01 0x10
Crazyflie-to-Host: <port/chan> 0x01 0x10

SET_MEM_ERASE

This command is used to mass erase a memory with a given id. The id of memories is sequential and is from 0 to one less than the returned number of memories from GET_NUMBER_OF_MEMS.

The request from host to Crazyflie:

Byte Field Value Length Comment
0 SET_MEM_ERASE 0x03 1 The command byte
1 MEM_ID 1 A memory id that is 0 ⇐ id < NBR_OF_MEMS

Reply from Crazyflie to host:

Byte Field Value Length Comment
0 SET_MEM_ERASE 0x03 1 The command byte
1 MEM_ID 1 The memory id
2 STATUS 1 The status of the command (see below)

Example of requesting a mass erase for a memory with MEM_ID=2

Host-to-Crazyflie: <port/chan> 
Crazyflie-to-Host: <port/chan> 

Example of

Host-to-Crazyflie: <port/chan> 
Crazyflie-to-Host: <port/chan> 

Channel 1: Memory read

This channel is only used to read memories and therefore the messages do not contain any command byte.

The request from host to Crazyflie:

Byte Field Value Length Comment
0 MEM_ID 1 A memory id that is 0 ⇐ id < NBR_OF_MEMS
1 MEM_ADDR 4 The address where the first byte should be read
5 LEN 1 The number of bytes to be read

Reply from Crazyflie to host if memory id is valid and the address and length to be read is valid:

Byte Field Value Length Comment
0 MEM_ID 1 A memory id that is 0 ⇐ id < NBR_OF_MEMS
1 MEM_ADDR 4 The address where the first byte should be read
5 STATUS 1 The status of the request (see below)
6 DATA 1..24? The data that was read (only if MEM_ID/MEM_ADDR/LEN is valid)

Where the STATUS field is:

STATUS Comment
0
1 ….

Example of reading LEN=0x0F bytes from MEM_ID=0x01 MEM_ADDR=0x0A

Host-to-Crazyflie: <port/chan> 0x01 0x0A 0x00 0x00 0x00 0x0F
Crazyflie-to-Host: <port/chan> 0x01 0x0A 0x00 0x00 0x00 0x00 0x01 0x09 0x62 0x63 0x4C 0x65 0x64 0x52 0x69 0x6E 0x67 0x02 0x01 0x62 0x55 

Channel 2: Memory write

This channel is only used to write memories and therefore the messages do not contain any command byte.

The request from host to Crazyflie:

Byte Field Value Length Comment
0 MEM_ID 1 A memory id that is 0 ⇐ id < NBR_OF_MEMS
1 MEM_ADDR 4 The address where the first byte should be read
5 DATA 1..24? The data to be written

Reply from Crazyflie to host if memory id is valid and the address and length to be written is valid:

Byte Field Value Length Comment
0 MEM_ID 1 A memory id that is 0 ⇐ id < NBR_OF_MEMS
1 MEM_ADDR 4 The address where the first byte should be read
4 STATUS 1 The status of the request (see below)

Where the STATUS field is:

STATUS Comment
0
1 ….

Example



doc/crazyflie/crtp/mem.1442551076.txt.gz · Last modified: 2015-09-18 06:37 by kristoffer