Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: atxmega32d4
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
addi
CODE
unsigned char flashpage[257];
unsigned short flashwpage[129];
void SP_Load_Flash_Buffer(unsigned char adres, unsigned short data)
{
cli();
asm("push r0");
asm("push r1");
asm("push r30");
asm("push r31");

asm("mov r30,r24");
asm("clr r31");
asm("mov r0,r23");
asm("mov r1,r22");

asm("ldi r24,0x23");
asm("sts 0x1ca,r24");
asm("spm");

asm("pop r31");
asm("pop r30");
asm("pop r1");
asm("pop r0");
sei();
};
void SP_Erase_WriteApplicationPage(unsigned short adres)
{
cli();
asm("push r16");
asm("push r30");
asm("push r31");

asm("mov r30,r24");
asm("mov r31,r24");

asm("ldi r16, 0x25");
asm("sts 0x1ca,r16");
asm("ldi r16, 0x9d");
asm("sts 0x34,r16");
asm("spm");


asm("pop r31");
asm("pop r30");
asm("pop r16");
sei();
_delay_ms(100);
};
//////////////////////////////////////////////
void SP_Erase_Flash_buffer(void)
{
NVM.CMD=NVM_CMD_ERASE_FLASH_BUFFER_gc;
NVM.CTRLA|=0x01;
_delay_ms(50);
};
////////////////////////////////////////////////////
void Story_Data_in_Flash(unsigned char page,unsigned char *buffer)
{
unsigned char offset=0;
unsigned short data=0;
SP_Erase_Flash_buffer();
for(offset=0;offset<254;offset+=2)
{
data=buffer[offset];
data<<=8;
data|=buffer[offset+1];
SP_Load_Flash_Buffer(offset,data);
};
data=buffer[254];
data<<=8;
data|=buffer[255];
SP_Load_Flash_Buffer(255,data);

SP_Erase_WriteApplicationPage(page);

};

/////////////////////////////////////////////////////////


cli();
flashpage[0] = 0x55;
SP_Erase_WriteApplicationPage(0x78);
_delay_ms(100);
Story_Data_in_Flash(0x78,flashpage);
_delay_ms(100);
flashpage[0] = 0x00;
SP_Load_Flash_Buffer(0x78, flashwpage);
_delay_ms(100);
if(flashwpage[0]==0x5500)
{
for(k=0; k<6; k++)
{
PORTD_OUT^=0x40;
PORTE_OUT = 0x00;
_delay_ms(400);
PORTE_OUT = 0xFF;
_delay_ms(200);
}
}

Здравствуйте

Пробую запись во флеш атиксмеги на основе вышеперечисленных функции, в итоге не получается

Прошу подсказать кто работал.

Заранее благодарен
_Артём_
Цитата(addi @ Sep 30 2012, 23:15) *
Код
    cli();
flashpage[0] = 0x55;
SP_Erase_WriteApplicationPage(0x78);
    _delay_ms(100);
Story_Data_in_Flash(0x78,flashpage);
    _delay_ms(100);
flashpage[0] = 0x00;
SP_Load_Flash_Buffer(0x78, flashwpage);
    _delay_ms(100);
if(flashwpage[0]==0x5500)
{
    for(k=0; k<6; k++)
    {    
             PORTD_OUT^=0x40;
    PORTE_OUT = 0x00;
              _delay_ms(400);
    PORTE_OUT = 0xFF;
    _delay_ms(200);
     }
}

Какая-то странная последовательность: обычно сначала грузят буфер, потом стирают-записывают или стирают страницу, грузят буфер и записывают.
Откуда пример взят? Или сами писали?
addi
Цитата(_Артём_ @ Oct 1 2012, 01:19) *
Какая-то странная последовательность: обычно сначала грузят буфер, потом стирают-записывают или стирают страницу, грузят буфер и записывают.
Откуда пример взят? Или сами писали?

спасибо за поддержку
Пример взял у человека который писал проект ранее, он их так и не использовал, откуда взял не знаю.
Я решил попровать, думал что "Load" это чтение, а буфер мой инициализированный массив.

А Вы не могли бы поделится своим опытом, записать я теперь попробую а считать как?
addi
Здравствуйте
В продолжении темы, перешел на IAR с AVRStudio для записи/чтения Flash. Взял пример у Атмела, но к сожалению у меня почемуто ничего не записывается((((......

Код
#include "sp_driver.h"
unsigned char flashdata[257],y,d;
PMIC_SetVectorLocationToBoot();

for(y=0;y<128;y++)
{ ClearFlashBuffer();
  //flashdata[y]=0x55;
  LoadFlashWord(y,0x5555);
  SP_WaitForSPM();
  
}
EraseWriteApplicationPage(0x3E00);


if(SP_ReadByte(0x3E00)==0x55)
{
PORTD_OUT |= 0x40;
}
for(;;)


Прошу подсказать что не так у кого примеры Атмела работают

Заранее благодарен

П.С. Адрессация под ATXMEGA32D4
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.