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

 
 
> PIC16 XC8 запись во flash программ, проблемы с записью в память программ
van_de_luxe
сообщение Jun 11 2014, 06:30
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 1-04-10
Пользователь №: 56 348



Контроллер PIC16LF1709
Компилятор XC8

Необходимо в контроллере хранить калибровочные поправки в возможностью изменения.
Чтение и стирание памяти сделать получилось, делал как описано в даташите
Код
uint16_t ReadWordFlash(uint16_t adr){
    PMADR = adr;
    CFGS = 0;
    RD = 1;
    NOP();
    NOP();
    return PMDAT;
}


void EraseRowFlash(uint16_t adr){
    uint8_t StatusGIE = GIE;
    GIE = 0;
    PMADR = adr;
    CFGS = 0;
    FREE = 1;
    WREN = 1;
    //unlock sequense
    PMCON2 = 0x55;
    PMCON2 = 0xAA;
    //start erase
    WR = 1;
    //wait
    NOP();
    NOP();
    //wait ~2ms operation
    WREN = 0;
    GIE = StatusGIE;
}


А вот с записью проблемы. Делал по тому же даташиту, но в результате в памяти никаких изменений. (код сократил до записи в память 1 слова)
Код
void WriteRowFlash(uint16_t adr){
    uint8_t StatusGIE = GIE;
    GIE = 0;
    CFGS = 0;
    PMADR = adr;
    FREE = 0;
    LWLO = 1;
    WREN = 1;
    PMDAT = 0xaaaa;
    LWLO = 0;
    //unlock sequense
    PMCON2 = 0x55;
    PMCON2 = 0xAA;
    //wait
    NOP();
    NOP();    
    WREN = 0;
    GIE = StatusGIE;
}


Подскажите, что делаю не правильно

Сообщение отредактировал van_de_luxe - Jun 11 2014, 06:35
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
Voldemari4
сообщение Jun 11 2014, 06:50
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 5-05-14
Из: Минск
Пользователь №: 81 582



А вы анлок и запись местами не перепутали случайно и вот еще что:
Цитата
Before writing to program memory, the word(s) to be
written must be erased or previously unwritten.
Go to the top of the page
 
+Quote Post
van_de_luxe
сообщение Jun 11 2014, 07:00
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 1-04-10
Пользователь №: 56 348



Нашел ошибку, вот правильный код, если кому понадобится

Код
void UnlockSequence() {
    PMCON2 = 0x55;
    PMCON2 = 0xAA;
    WR = 1;
    NOP();
    NOP();
}


void WriteRowFlash(uint16_t adr){
    uint8_t StatusGIE = GIE;
    GIE = 0;
    CFGS = 0;
    PMADR = adr;
    FREE = 0;
    LWLO = 1;
    WREN = 1;

    PMDAT = 0xaaaa;
    LWLO = 0;
    UnlockSequence();
    WREN = 0;
    GIE = StatusGIE;
}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 5th September 2025 - 02:01
Рейтинг@Mail.ru


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