#c #memory #driver #spi #flash-memory
Вопрос:
Я пишу драйвер SPI для внешней флэш-памяти. Я изучал таблицу данных, но все еще не могу полностью понять несколько битов: https://datasheet.datasheetarchive.com/originals/dk/DKDS-24/460477.pdf
Меня больше всего беспокоят команды page_program (02h) и read_data (03h).
В данный момент все, что я пытаюсь сделать, это записать всего 3 байта данных на страницу и еще 3 байта данных на 2-ю страницу.
- Что касается программы page_program, я не могу полностью понять, как правильно установить биты адреса. Из документации следует, что наименее значимый бит должен быть установлен в 0, если написана вся страница. Означает ли это, что оставшиеся 16 бит адреса выбирают, какую страницу я хочу написать? Например (какой-то псевдокод)
uint8_t command_byte = 0x02;
uint8_t page = 0x01;
uint8_t address_bytes[3] = {0x00,0x00,page};
t.cmd=command_byte;
t.addr=address_bytes;
t.length = 24; //sending 3 bytes
t.tx_data[0] = 0x01;
t.tx_data[1] = 0x03;
t.tx_data[2] = 0x05;
t.flags=SPI_TRANS_USE_TXDATA;
spi_device_polling_transmit(spi, amp;t);
Приведенная выше функция должна записать 3 байта на страницу 1. Правильно ли я понимаю или я полностью ошибаюсь?
- Что касается команды read_data, я также не уверен, как правильно установить биты адреса. Если я правильно понимаю, если я хочу прочитать страницу 0, я должен прочитать адрес 0x00,0x00,0x00. Если я хочу читать со страницы 1, я должен читать, начиная с адреса 256, потому что страница 0 занимает 255 байт. Правильно ли я понимаю? Так, например, для чтения данных страницы 1 я бы сделал : (псевдокод)
uint8_t command_byte = 0x03;
uint8_t address_bytes[3] = {0x00,0x01,0x00};
t.cmd=command_byte;
t.addr=address_bytes;
t.flags=SPI_TRANS_USE_RXDATA;
t.rxlength=8*3;
spi_device_polling_transmit(spi, amp;t);
for(int i = 0;i<3;i ){
printf("rx_data[%i] = %x n",i,t.rx_data[i]);
}
Пожалуйста, имейте в виду, что опубликованный код-это просто псевдокод, я просто хочу уточнить, правильно ли я понимаю. Буду признателен за любую помощь..
Комментарии:
1. Это голый металл? В Linux существует множество драйверов для случаев SPI-NOR и SPI-NAND. Вы можете изучить варианты реализации.