This page has deprecated and moved to the new documentation framework of the main Bitcraze website. Please go to [[https://www.bitcraze.io/documentation/system/]] ====== Memory access ====== Memory access is not used for the [[projects:crazyflie:index|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. /------------------------\ /-------------------\ /----------------\ No /------\ --> | Get number of memories |----->| Fetch memory info |---->| More memories? |-------->| Done | \------------------------/ \-------------------/ \----------------/ \------/ ^ | | | \------------------------/ Yes ====== 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: 0x01 Crazyflie-to-Host: 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: 0x02 0x01 Crazyflie-to-Host: 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: 0x01 0x10 Crazyflie-to-Host: 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: Crazyflie-to-Host: Example of Host-to-Crazyflie: Crazyflie-to-Host: ===== 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: 0x01 0x0A 0x00 0x00 0x00 0x0F Crazyflie-to-Host: 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