Запись/чтение драйвера флэш-памяти W25Q32JV SPI

#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-ю страницу.

  1. Что касается программы 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. Правильно ли я понимаю или я полностью ошибаюсь?

  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. Вы можете изучить варианты реализации.