Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
sheackspear
5 / 5 / 1
Регистрация: 18.06.2013
Сообщений: 30
1

Запись и чтение данных NAND flash подключенной к STM32F4_diskovery

27.05.2016, 12:48. Просмотров 3382. Ответов 4
Метки нет (Все метки)

Доброе время суток.
Суть проблемы. К МК STM32F4_diskovery подключил NAND память MT29F64G08. написал код для инициализации флеша по пинам.
Начал читать тестовый ID. Получается правильно.
Не могу понять как на С записать данные на страницу памяти, а потом считать их.
Как я понимаю для чтения идет такой код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uint8_t buffer[5];
uint8_t * data = (uint8_t *)FSMC_Bank2_NAND_data;
uint8_t * command = (uint8_t *)FSMC_Bank2_NAND_Command;
uint8_t * address = (uint8_t *)FSMC_Bank2_NAND_Address;
turn_on_ce(NAND_CE0);
*command = 0x00;
*address = 0x00;
*address = 0x00;
*address = 0x00;
*address = 0x00;
*address = 0x00;
*command = 0x30;
buffer[0] =data[0];
buffer[1] =data[1];
buffer[2] =data[2];
buffer[3] =data[3];
buffer[4] =data[4];
а для записи
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uint8_t buffer[5]={0xAA};
uint8_t * data = (uint8_t *)FSMC_Bank2_NAND_data;
uint8_t * command = (uint8_t *)FSMC_Bank2_NAND_Command;
uint8_t * address = (uint8_t *)FSMC_Bank2_NAND_Address;
turn_on_ce(NAND_CE0);
*command = 0x80;
*address = 0x00;
*address = 0x00;
*address = 0x00;
*address = 0x00;
*address = 0x00;
*command = 0x10;
data[0 ]= buffer[0] ;
data[1] = buffer[1] ;
data[2] = buffer[2] ;
data[3] = buffer[3] ;
data[4] = buffer[4] ;
програмирую под кейлом. проблема в том что не записыватеся. и как я понимаю неправильно адресация идет.
Подскажите как в MT29F64G08 правильно организована адресация? и как правильно записывать данные и считывать их?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2016, 12:48
Ответы с готовыми решениями:

LPC1114 и NAND Flash
Здравствуйте. Изначально не занимался программированием микроконтроллеров, но по работе возникло...

STM32F4+HY27US0821(NAND FLASH).
Всем привет)) Итак, к STM32 по FSMC подключена NAND FLASH(интерфейс 8 бит). И вот какой вопрос...

Перезапись одной страницы NAND Flash
Имеется Flash память Samsund K9GAG08U0E. Запись производится по одной странице (8 КБ), а вот...

Странный глюк NAND Flash в STM32F303VCT6
Приветствую всех! У меня сложилась очень странная ситуация с записью данных в встроенную NAND...

Нужна помощь бывалых с STM32+TFT+Nand Flash
Доброе время суток всем! Не так давно начал изучать ARM-ы. Хочу завязать такую паутину: Камень:...

4
sheackspear
5 / 5 / 1
Регистрация: 18.06.2013
Сообщений: 30
15.08.2016, 16:30  [ТС] 2
ТАм оказалось что надо стирать блок перед записью.
Тема закрыта. все просто
0
Voland_
1670 / 1058 / 100
Регистрация: 04.01.2010
Сообщений: 3,589
21.08.2016, 09:59 3
sheackspear, ну так удачным кодом поделитесь? Конечно при работе FLASH надо учитывать ее предыдущее состояние.
PS: попробуйте использовать DMA для вашей задачи. Мне кажется, здесь DMA будет смотреться очень красиво и эффектно. Ну, и конечно, работать раза в полтора-два быстрее.
0
sheackspear
5 / 5 / 1
Регистрация: 18.06.2013
Сообщений: 30
23.08.2016, 12:57  [ТС] 4
Без проблем. После того как разобрался что надо делать нашел удачную реализацию функций низкого уровня по чтению и записи страниц памяти
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*-----------------------------------------------------------------------------
 *      Read data from NAND
 *  row  = Page address
 *  *buf = Pointer to data buffer
 *  *cfg = Pointer to configuration structure
 *----------------------------------------------------------------------------*/
static U32 FSMC_NAND_Read (U32 row, U8 *buf, NAND_DRV_CFG *cfg) {
  U32 i, sz;
    U8 p;
  /* Write command 1 */
  NAND_WrCmd (NAND_CMD_READ1ST);
  /* Set address */
  NAND_SetPgAddr (cfg->AddrCycles, row, cfg->PageSize);
  /* Write command 2 */
  NAND_WrCmd (NAND_CMD_READ2ND);
 
  /* Switch back to read: Write command 1 */
  NAND_WrCmd (NAND_CMD_READ1ST);
 
  /* Read page from NAND chip */
  sz = cfg->PageSize;
  for (i = 0; i < sz; i += 8) {
    buf[i]   = NAND2_DATA_W8;
    buf[i+1] = NAND2_DATA_W8;
    buf[i+2] = NAND2_DATA_W8;
    buf[i+3] = NAND2_DATA_W8;
    buf[i+4] = NAND2_DATA_W8;
    buf[i+5] = NAND2_DATA_W8;
    buf[i+6] = NAND2_DATA_W8;
    buf[i+7] = NAND2_DATA_W8;
  }
  return RTV_NOERR;
}
 
 
/*-----------------------------------------------------------------------------
 *      Write data to NAND
 *  row  = Page address
 *  *buf = Pointer to data to write
 *  *cfg = Pointer to configuration structure
 *
 *----------------------------------------------------------------------------*/
static U32 FSMC_NAND_Write (U32 row, U8 *buf, NAND_DRV_CFG *cfg) {
  U32 i, sz;
  /* Write command 1 */
  NAND_WrCmd (NAND_CMD_PROG1ST);
  /* Set address */
  NAND_SetPgAddr (cfg->AddrCycles, row, cfg->PageSize);
 
  /* Write data to NAND chip */
  sz = cfg->PageSize;
  for (i = 0; i < sz; i += 8) {
    NAND2_DATA_W8 = buf[i];
    NAND2_DATA_W8 = buf[i+1];
    NAND2_DATA_W8 = buf[i+2];
    NAND2_DATA_W8 = buf[i+3];
    NAND2_DATA_W8 = buf[i+4];
    NAND2_DATA_W8 = buf[i+5];
    NAND2_DATA_W8 = buf[i+6];
    NAND2_DATA_W8 = buf[i+7];
  }
  /* Write command 2 */
 NAND_WrCmd (NAND_CMD_PROG2ND);
 return RTV_NOERR;
}
 
/*-----------------------------------------------------------------------------
 *      Erase block of memory on NAND
 *  row  = Block address
 *  *cfg = Pointer to configuration structure
 * 
 *----------------------------------------------------------------------------*/
static U32 FSMC_NAND_Erase (U32 row, NAND_DRV_CFG *cfg) {
  /* Write command 1 */
  NAND_WrCmd (NAND_CMD_ERASE1ST);
  
  /* Set address */
  NAND_SetBlAddr (cfg->AddrCycles, row, cfg->PageSize);
  
  /* Write command 2 */
  NAND_WrCmd (NAND_CMD_ERASE2ND);
 
  /* Wait until NAND ready */
  if (NAND_WaitReady() == __FALSE) {
    return ERR_NAND_HW_TOUT;
  }
 return RTV_NOERR;
}
/*-----------------------------------------------------------------------------
 *      Raed ID memory
            * ID = buffer to writing ID memory 
            *cfg = Pointer to configuration structure
 *----------------------------------------------------------------------------*/
U32 FSMC_NAND_ReadID (unsigned char *ID, NAND_DRV_CFG *cfg) {
  
/* Write command 1 */
NAND_WrCmd (NAND_CMD_READID);
/* Set address */
//NAND_SetPgAddr (cfg->AddrCycles, 0x00, cfg->PageSize);
NAND2_DATA_W8 = 0x00;
ID[0] = NAND2_DATA_W8;
ID[1] = NAND2_DATA_W8;
ID[2] = NAND2_DATA_W8;
ID[3] = NAND2_DATA_W8;
ID[4] = NAND2_DATA_W8;
 
return RTV_NOERR;
}
DMA уже не пробовал так как решил проблему и сейчас на следующем этапе.
а вызов функций должен быть так
C++
1
2
3
4
err = FSMC_NAND_Erase (row, &cfg);
err = FSMC_NAND_ReadID (ID, &cfg)
err = FSMC_NAND_Write (row, buf, &cfg);
err = FSMC_NAND_Read (row, buf, &cfg);
1
sheackspear
5 / 5 / 1
Регистрация: 18.06.2013
Сообщений: 30
23.05.2017, 00:06  [ТС] 5
Доброй ночи проблема решилась давно. но к сожалению дошли руки написать только сейчас. Сама проблема оказалась в выборе нанд памяти. с той что была выбрана не получается стандарными средствами работать.
0
23.05.2017, 00:06
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2017, 00:06

MikroC. Запись-чтение байт во Flash память PIC18F452
Нашел вот такую функцию. void Flash_Write_Sector(long address, char *data) { unsigned short...

NAND FLASH PROGRAMMER
Доброго дня всем , всё чаще возникает необходимость перешивать Nomd-Ftosh память,стоит и в...

NAND flash - не читает
Пытаюсь разобраться с NAND ftosh. В качестве моста между компьютером и микросхемой ftosh-памяти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru