|
Не получается соединить STM32L152 и N25Q128! |
|
|
|
Mar 11 2014, 18:40
|
Группа: Участник
Сообщений: 14
Регистрация: 11-03-14
Пользователь №: 80 887

|
Кто работал с этой памятью, может кто-нибудь что-нибудь посоветовать?
|
|
|
|
|
 |
Ответов
|
Mar 17 2014, 18:41
|
Группа: Участник
Сообщений: 14
Регистрация: 11-03-14
Пользователь №: 80 887

|
Выложите пожалуйста функцию записи в память!!!
|
|
|
|
|
Mar 18 2014, 09:39
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Sergiocars @ Mar 17 2014, 21:41)  Выложите пожалуйста функцию записи в память!!! n25q128 массово применяется не в одном серийном устройстве. Я бы советовал для начала обратится к ней используя софтовый spi. Приведённый ниже код взят из серийного проекта. В оригинале используется аппаратный spi, но процессор не STM, поэтому я привёл программный (ранее использовавшийся и также 100% рабочий). Надёюсь поможет Вам разобраться в проблеме. CODE //------------------------------------------- unsigned char SPIWriteChar(unsigned char cmd) { unsigned char i; unsigned char recv; recv = 0; for(i=0; i<8; i++) { if((cmd&0x80) != 0) { SPI_PORT_SET = MOSI; } else { SPI_PORT_CLR = MOSI; } SPI_PORT_SET = SCK; recv<<=1; if((SPI_PIN & MISO) != 0) { recv|=0x01; } SPI_PORT_CLR = SCK; cmd<<=1; } return recv; } //-------------------------------------------
//------------------------------------------- unsigned char SPIReadChar(void) { return SPIWriteChar(0x00); } //-------------------------------------------
//------------------------------------------- //макросы доступа к устройствам SPI void DESELECT_SPI(void) { //деактивируем все устройства SPI SPI_PORT_SET = nSS_SFLASH; SPI_PORT_CLR = SCK|MOSI; //устанавливаем выводы в исходное состояние } //-------------------------------------------
//------------------------------------------- void SELECT_SPI(unsigned int msk) { DESELECT_SPI(); //деактивируем все устройства SPI SPI_PORT_CLR = msk; //активируем необходимое } //-------------------------------------------
//------------------------------------------- //инициализация SPI void ConfigureSPI() { //настройка порта и начальных уровней SPI_DIR &= ~MISO; SPI_DIR |= SCK|MOSI; SPI_DIR |= nSS_SFLASH; SPI_PORT_SET = nSS_SFLASH; SPI_PORT_CLR = SCK|MOSI; } //------------------------------------------- CODE //-------------------------------- //------------------------------------ //коды команд работы с памятью enum { N25_WREN = 0x06, //write enable N25_WRDI = 0x04, //write disable N25_RDID = 0x9f, //read id N25_RDSR = 0x05, //read status register N25_WRSR = 0x01, //write status reg N25_WRLR = 0xe5, //write lock reg N25_RDLR = 0xe8, //red lock reg N25_READ = 0x03, //read data bytes N25_FAST_READ = 0x0b, //fast read data bytes N25_PP = 0x02, //page prog N25_SE = 0xd8, //sector erase 64k N25_SE_4K = 0x20, //sub sector erase 4k N25_BE = 0xc7, //bulk erase }; //------------------------------------
//------------------------------------ //биты регистра статуса enum { N25_WIP = 0x01, //write in progress N25_WIL = 0x02, //write enable latch status N25_BP2 = 0x04, // N25_BP1 = 0x08, // N25_BP0 = 0x10, // N25_SRWD = 0x80, //status register write disable }; //------------------------------------
//------------------------------------ //параметры памяти enum { //N25_SECTOR_NUM = 4096, //sectors by 4k N25_SECTOR_NUM = 2048, //sectors by 4k N25_SECTOR_SIZE = 4096, N25_PAGE_SIZE = 256, M25_PAGE_PER_SECTOR = N25_SECTOR_SIZE/N25_PAGE_SIZE, //4096/256=16 N25_PP_TM = 10, //таймаут записи страницы N25_SE_4K_TM = 1000, //таймаут стирания сектора }; //------------------------------------
//процедура разрешения записи в память void n25setWREN(void) { SELECT_SPI(nSS_SFLASH); //выбираем устройство spi SPIWriteChar(N25_WREN); //запись кода команды DESELECT_SPI(); //отпускаем устройство spi } //--------------------------------
//-------------------------------- //процедура запрещения записи в память void n25setWRDIS(void) { SELECT_SPI(nSS_SFLASH); //выбираем устройство spi SPIWriteChar(N25_WRDI); //запись кода команды DESELECT_SPI(); //отпускаем устройство spi } //--------------------------------
//-------------------------------- //ожидание завершения операции записи unsigned int n25waitBusy(unsigned int tm) { volatile unsigned int status; SELECT_SPI(nSS_SFLASH); //выбираем устройство spi SPIWriteChar(N25_RDSR); //запись кода команды for(unsigned int i=0; i<tm; i++) { status = SPIWriteChar(0x00); //читаем статус if((status & N25_WIP) == 0) { DESELECT_SPI(); //отпускаем устройство spi return 1; //оперция завершена } //ожидание паузы в 1 mS //for(volatile unsigned int j=0; j<(50*1000); j++); //пауза на исполнение delay_ms(1); } DESELECT_SPI(); //отпускаем устройство spi return 0; //ошибка таймаута } //--------------------------------
//-------------------------------- //процедура чтения страницы памяти void n25pageRead(unsigned char* buff, unsigned int page, unsigned int byte, unsigned int size) { unsigned int addr=0; //вычисляем физический адрес байта addr = page*N25_PAGE_SIZE+byte; SELECT_SPI(nSS_SFLASH); //выбираем устройство spi SPIWriteChar(N25_READ); //запись кода команды SPIWriteChar( (unsigned char) (addr>>16) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>8) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>0) ); //запись адреса while(size--) { *buff++ = SPIWriteChar(0x00); } DESELECT_SPI(); //отпускаем устройство spi } //-----------------------------
//-------------------------------- //процедура чтения сектора памяти void n25sectorRead(unsigned char* buff, unsigned int sector, unsigned int byte, unsigned int size) { unsigned int addr=0; //вычисляем физический адрес байта addr = sector*N25_SECTOR_SIZE+byte; SELECT_SPI(nSS_SFLASH); //выбираем устройство spi SPIWriteChar(N25_READ); //запись кода команды SPIWriteChar( (unsigned char) (addr>>16) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>8) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>0) ); //запись адреса while(size--) { *buff++ = SPIWriteChar(0x00); } DESELECT_SPI(); //отпускаем устройство spi } //-----------------------------
//-------------------------------- //процедура записи страницы памяти void n25pageWrite(unsigned char* buff, unsigned int page, unsigned int byte, unsigned int size) { unsigned int addr=0; //вычисляем физический адрес байта addr = page*N25_PAGE_SIZE+byte; n25setWREN(); //разрешаем запись в память SELECT_SPI(nSS_SFLASH); //выбираем устройство spi SPIWriteChar(N25_PP); //запись кода команды SPIWriteChar( (unsigned char) (addr>>16) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>8) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>0) ); //запись адреса //записываем данные while(size--) { SPIWriteChar(*buff++); } DESELECT_SPI(); //отпускаем устройство spi //ожидаем завершения операции n25waitBusy(N25_PP_TM); } //-----------------------------
//-------------------------------- //процедура записи сектора памяти void n25sectorWrite(unsigned char* buff, unsigned int sector, unsigned int size) { unsigned int page; unsigned int page_num; //вычисляем кол-во страниц и стартовый адрес страницы page = sector*M25_PAGE_PER_SECTOR; page_num = size/N25_PAGE_SIZE; for(unsigned int i=0; i<page_num; i++) { n25pageWrite(buff+i*N25_PAGE_SIZE, page+i, 0, N25_PAGE_SIZE); } } //-----------------------------
//-------------------------------- //процедура стирания сектора void n25sectorErase(unsigned int sector) { //вычисляем физический адре байта unsigned int addr = sector*N25_SECTOR_SIZE; n25setWREN(); //разрешаем запись в память SELECT_SPI(nSS_SFLASH); //выбираем устройство spi SPIWriteChar(N25_SE_4K); //запись кода команды SPIWriteChar( (unsigned char) (addr>>16) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>8) ); //запись адреса SPIWriteChar( (unsigned char) (addr>>0) ); //запись адреса
DESELECT_SPI(); //отпускаем устройство spi //ожидаем завершения операции n25waitBusy(N25_SE_4K_TM); n25setWRDIS(); } //--------------------------------
//----------------------------- //инициализация памяти void n25xxInit(void) { n25setWRDIS(); } //-----------------------------
|
|
|
|
Сообщений в этой теме
Sergiocars Не получается соединить STM32L152 и N25Q128! Mar 11 2014, 18:40 Zeal0t Если это Micron Serial NOR Flash Memory то работал... Mar 12 2014, 03:02 Sergiocars Да оно! Не могу записать в память Mar 12 2014, 03:33 Сергей Борщ Цитата(Sergiocars @ Mar 12 2014, 05:33) Д... Mar 12 2014, 03:37  Harvester Цитата(Сергей Борщ @ Mar 12 2014, 07:37) ... Mar 12 2014, 03:55 Zeal0t Подключена как? Extended SPI режим или полный? Есл... Mar 12 2014, 03:42 Sergiocars Если ничего не меняю изначально, то режим Extended... Mar 12 2014, 03:55 Harvester Цитата(Sergiocars @ Mar 12 2014, 07:55) Е... Mar 12 2014, 03:57 Zeal0t Цитата(Sergiocars @ Mar 12 2014, 07:55) Е... Mar 12 2014, 04:05 Sergiocars Если в status register = 00h, то и биты BP0:3 все ... Mar 12 2014, 04:04 Sergiocars При команде read id 9eh выдает : 00 c1 00 00 00 01... Mar 12 2014, 04:12 Zeal0t Цитата(Sergiocars @ Mar 12 2014, 08:12) П... Mar 12 2014, 04:20 Harvester Цитата(Sergiocars @ Mar 12 2014, 08:12) П... Mar 12 2014, 04:21 Sergiocars Инициализация порта:
RCC->AHBENR |= RCC_AHBE... Mar 12 2014, 04:28 Zeal0t Цитата(Sergiocars @ Mar 12 2014, 08:28) И... Mar 12 2014, 04:40 Sergiocars попробую дергать cs по другому и вечером отпишусь Mar 12 2014, 04:47 Zeal0t Цитата(Sergiocars @ Mar 12 2014, 08:47) п... Mar 12 2014, 04:59 Sergiocars А где ты включаешь SPI ?
вот этот бит не устанавли... Mar 16 2014, 20:12 haker_fox QUOTE (Sergiocars @ Mar 17 2014, 05:12) И... Mar 16 2014, 20:30 Zeal0t Цитата(Sergiocars @ Mar 17 2014, 00:12) А... Mar 17 2014, 01:46 Sergiocars Скорость SPI ставлю маленькую 32 МГц / 64 = 500 КГ... Mar 16 2014, 20:56 haker_fox QUOTE (Sergiocars @ Mar 17 2014, 05:56) С... Mar 16 2014, 22:00 Sergiocars Перепаяю отпишу
посылаю команду 0x9f
припаял ... Mar 16 2014, 22:44 haker_fox Ну на первый взгляд у вас всё нормально, кроме отв... Mar 16 2014, 23:31 Sergiocars хорошо буду чип менять Mar 17 2014, 03:15 Zeal0t Цитата(Sergiocars @ Mar 17 2014, 22:41) В... Mar 18 2014, 03:57 Harvester Цитата(Sergiocars @ Mar 17 2014, 22:41) В... Mar 18 2014, 05:05  haker_fox QUOTE (Harvester @ Mar 18 2014, 14:05) По... Mar 18 2014, 10:12   mempfis_ Цитата(haker_fox @ Mar 18 2014, 14:12) За... Mar 18 2014, 10:20   Harvester Цитата(haker_fox @ Mar 18 2014, 14:12) Но... Mar 18 2014, 13:21 Sergiocars Я перепаял чип на другой такой же с 8ю ногами, а п... Mar 18 2014, 17:00 haker_fox QUOTE (Sergiocars @ Mar 19 2014, 02:00) к... Mar 18 2014, 23:44  Harvester Цитата(haker_fox @ Mar 19 2014, 03:44) N2... Mar 19 2014, 04:29   haker_fox QUOTE (Harvester @ Mar 19 2014, 13:29) то... Mar 19 2014, 10:49    Harvester Цитата(haker_fox @ Mar 19 2014, 14:49) А ... Mar 19 2014, 11:24   jcxz Цитата(Harvester @ Mar 19 2014, 10:29) PS... Mar 29 2014, 01:51 mempfis_ Цитата(Sergiocars @ Mar 18 2014, 20:00) Я... Mar 19 2014, 06:17  Harvester Цитата(mempfis_ @ Mar 19 2014, 10:17) При... Mar 19 2014, 06:32  mempfis_ Цитата(mempfis_ @ Mar 19 2014, 09:17) Я р... Mar 19 2014, 06:51 Sergiocars Начал дергать СS отдельно пином порта, все заработ... Mar 28 2014, 18:06 haker_fox Сорри за поднятие старья) Но подтверждаю, 4 Кб сти... May 21 2014, 23:52 Радиотехник73 Здравствуйте, используем память N25Q512A13GF840 на... Jun 27 2017, 12:19 RoadRunner Всем доброго времени суток.
Работаю с N25Q256 по... Oct 3 2017, 13:58 TrestConsom Цитата(RoadRunner @ Oct 3 2017, 19:58) Вс... Oct 4 2017, 05:12  RoadRunner Цитата(TrestConsom @ Oct 4 2017, 08:12) П... Oct 4 2017, 08:31 jcxz Цитата(RoadRunner @ Oct 3 2017, 20:58) Сч... Oct 4 2017, 05:23 RoadRunner Да, действительно, после предварительного стирания... Oct 9 2017, 09:48
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|