Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/320: Рейтинг темы: голосов - 320, средняя оценка - 4.86
 Аватар для northcitizen
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345

FLASH память (внешняя)

13.06.2019, 17:48. Показов 63956. Ответов 20

Студворк — интернет-сервис помощи студентам
Товарищи! Подскажите пожалуйста..

Хочу приконнектить внешнюю память winbond w25q16 к микроконтроллеру stm32f103c8t6 используя HAL

если отправляю команды для получения ID устройства, то он мне все присылает, то есть (0xef и 0x14) как указано в даташите..

когда работаю с данными сначала всегда снимаю защиту с микросхемы
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Flash_write_status()
    { 
        uint8_t Write_Enable = 0x06;
    uint8_t Sector_Erase = 0x01;        
        Address0 = 0;
    Address1 = 0;
        
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);     // CS to low        
    HAL_SPI_Transmit(&hspi1,&Write_Enable,1,1); // Write Enable Command     
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);       // CS to high
        
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);    // CS to low         
    HAL_SPI_Transmit(&hspi1,&Sector_Erase,1,0);// Page Program Command
        HAL_SPI_Transmit(&hspi1,&Address1,1,0); 
        HAL_SPI_Transmit(&hspi1,&Address0,1,0);     
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);       // CS to high       
      HAL_Delay (250);      
    }
потом включаю очистку всего чипа данной функцией
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Flash_Erase_Chip(void)
{
    uint8_t Write_Enable = 0x06;
    uint8_t Erase_Chip = 0xC7;
 
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);     // CS to low
    
    HAL_SPI_Transmit(&hspi1,&Write_Enable,1,1); // Write Enable Command
    
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);       // CS to high
  
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);     // CS to low
 
    HAL_SPI_Transmit(&hspi1,&Erase_Chip,1,1);   // Erase Chip Command
 
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);       // CS to high
      HAL_Delay (50000); 
 
}
после этого все данные равны 0xFF(так и должно быть).
но когда пытаюсь записать данные то ничего в буфере не меняется...
C
1
2
3
4
5
6
7
8
9
10
11
   Flash_Erase_Chip();
   Flash_write_status();
    
       
      txData[0] = 0x01; 
 
  while (1)
  {    
   Flash_Write_Data(1,1,txData);
  Flash_Read_Data (1,1,rxData); 
   }
функции записи и чтения такие
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
void Flash_Write_Data(unsigned int address, unsigned int count, unsigned char * buffer)
{
    uint8_t Write_Enable = 0x06;
    uint8_t Page_Program = 0x02;      
    
    Address0 = (uint8_t)(address & 0x000000ff);
  Address1 = (uint8_t) ((address & 0x0000ff00) >> 8);
  Address2 = (uint8_t) ((address & 0x00ff0000) >> 16);    
    
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);     // CS to low    
    HAL_SPI_Transmit(&hspi1,&Write_Enable,1,0); // Write Enable Command
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);       // CS to high 
    
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);    // CS to low 
 
    HAL_SPI_Transmit(&hspi1,&Page_Program,1,0);// Page Program Command
    
    HAL_SPI_Transmit(&hspi1,&Address2,1,0);     // Write Address 
        HAL_SPI_Transmit(&hspi1,&Address1,1,0); 
        HAL_SPI_Transmit(&hspi1,&Address0,1,0);
        
     for (unsigned int i=0; i<count; i++){
    HAL_SPI_Transmit(&hspi1,&buffer[i],1,1);      
     }
     
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);       // CS to high   
   
}
чтение:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Flash_Read_Data (unsigned int address, unsigned int count, unsigned char * buffer)
{      
     uint8_t Read_Data = 0x03;    
    
    Address0 = (uint8_t)(address & 0x000000ff);
  Address1 = (uint8_t) ((address & 0x0000ff00) >> 8);
  Address2 = (uint8_t) ((address & 0x00ff0000) >> 16);
    
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);   // CS low
    
    HAL_SPI_Transmit(&hspi1,&Read_Data,1,0);  // Read Command
        
      HAL_SPI_Transmit(&hspi1,&Address2,1,0);     // Write Address 
        HAL_SPI_Transmit(&hspi1,&Address1,1,0);
        HAL_SPI_Transmit(&hspi1,&Address0,1,0);
    
      for (unsigned int i=0; i<count; i++){
    HAL_SPI_Receive(&hspi1,&buffer[i],1,1);      //     
      }
        
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);       // CS to high   
      
}
не знаю что не так
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2019, 17:48
Ответы с готовыми решениями:

stm32+ внешняя память(flash, fram, eeprom)
День добрый. Понадобилось хранить достаточно большой объем данных, порядка 128 кбайт. Необходимо их хранить в энергонезависимой памяти....

Внешняя память на 256 мб для STM32
Хотелось бы подключить к МК внешнюю память для хранения данных, желаемый размер 256 мегабайт и подключение не через FSMC, а I2C или SPI ...

Flash память контроллера
Взбрендили мне в голову такую мысль: прошивка контроллера заливается во внутренную флэш память, где и хранится весь срок жизни(если это...

20
0 / 0 / 0
Регистрация: 25.01.2020
Сообщений: 1
05.07.2024, 06:21
Студворк — интернет-сервис помощи студентам
northcitizen, Здравствуйте.
Вы можете дать ссылку на свой рабочий проект?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2024, 06:21

Как разделить FLASH и RAM память
Собственно это и есть вопрос. Т.е. как разделить FLASH и RAM память что бы МК можно было прошивать двумя разными прошивками независимых...

Внешняя память PIC: как нарастить внутреннюю память данных?
Я только начал разбираться с ПИКами и пока не все понимаю. Мне нужно организовать систему сбора и обработки информации с газовых датчиков....

Внешняя память программ
Скажите кто нибудь цеплял внешнюю память программ к АТ89С51/52? Расскажите как это сделать, в гугле подробностей не нашел,все как то в...

Внешняя память данных.
Требуется работать с внешней памятью (ROM). Не могу найти внятного описания карты внешней памяти. Помогите, кто может. Спасибо!

Внешняя оперативная память
Народ кто цеплял? У меня 8515, хочу подсоеденить 64 кб. В даташитах рекомендуют использовать быстрый регистр,причем в примерах кварц 4 или...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru