реклама на сайте
подробности

 
 
> Не получается соединить STM32L152 и N25Q128!
Sergiocars
сообщение Mar 11 2014, 18:40
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 11-03-14
Пользователь №: 80 887



Кто работал с этой памятью, может кто-нибудь что-нибудь посоветовать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sergiocars
сообщение Mar 17 2014, 18:41
Сообщение #2





Группа: Участник
Сообщений: 14
Регистрация: 11-03-14
Пользователь №: 80 887



Выложите пожалуйста функцию записи в память!!!
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 18 2014, 09:39
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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();
}
//-----------------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 14:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01585 секунд с 7
ELECTRONIX ©2004-2016