Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с программированием EEPROM motorola MC9S12XDP512
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
sway
Пишу прогу которая должна сохранять свои настройки в памяти, чтобы не использовать внешнюю решил использовать встроенную EEPROM. Согласно datasheet ну и еще паре документов (AN2204, AN2153) написал тестовую прогу, но почему данные не записываются вообще, да и при считывание из EEPROM получаю совсем другие значения, чем те которые в данный момент находятся в EEPROM. Посоветуйте пожалуйста как быть. Может можно вместо встроенную флешку использовать. Буду очень благодарен если примеры выложите или ссылки полезные
sway
Извиняюсь что не выложил в прошлом сообщение код laughing.gif с собой просто не было, я делаю вот так:

/************************* Project Include Files *****************************/
#include "stdtypes.h"
#include "mcucfg.h"
#include "s12_eectl.h"
/************************* typedefs ******************************************/
/************************* #Defines ******************************************/
#ifndef ALIGNED_WORD_MASK
#define ALIGNED_WORD_MASK 0x0001
#endif
#ifndef PASS
#define PASS 1
#endif
#ifndef FAIL
#define FAIL 0
#endif
/************************* Global Variables **********************************/
static tEEPROM eeprom @(REG_BASE + 0x110);
/************************* External Variables ********************************/
void
ConfigECLKDIV(void)
{
if(eeprom.eclkdiv.bit.edivld == 0)
{ /* configure EEPROM clock prescaler */
eeprom.eclkdiv.byte = 0x49;
}
return;
}
/******************************************************************************
UINT8
ProgEeprom(UINT16* progAdr, UINT16* bufferPtr, UINT16 size)
{
if(((UINT16)progAdr & ALIGNED_WORD_MASK) != 0)/* Check for aligned word */
{
return(FAIL);
}
/* Clear error flags */
eeprom.estat.byte = (ACCERR | PVIOL);
/* Word to program? */
while(size != 0)
{ /* Is command buffer empty? */
if(eeprom.estat.bit.cbeif == 1)
{
/* Latch data and address */
*progAdr++ = *bufferPtr++;
/* Configure prog command */
eeprom.ecmd.byte = PROG;
/* Launch the command */
eeprom.estat.byte = CBEIF;
/* Was the access error flag set? */
/* Was the protection violation error flags set */
if((eeprom.estat.bit.accerr == 1) ||
(eeprom.estat.bit.pviol == 1))
{
return(FAIL);
}
/* next word */
size--;
}
}
/* Wait for last command to finish */
while(eeprom.estat.bit.ccif != 1)
{
}
/* finished, no errors */
return(PASS);
}

UINT16 ADD = 0x0000;
UINT16 DATA = 0x0000;
byte Res = 0;
void main(void) {
// * put your own code here
ADD = 0xE087F0;
DATA = 0xA5A5;
Res = ProgEeprom((UINT16 *)0x0C00,(UINT16 *)DATA,1);
........


/******************************************************************************
File Name : s12_eectl.h
******************************************************************************/
#ifndef EECTL_H
#define EECTL_H
/************************* System Include Files ******************************/
/************************* Project Include Files *****************************/
#include "stdtypes.h"
/************************* typedefs ******************************************/
typedef union uECLKDIV
{
UINT8 byte;
struct
{
UINT8 ediv :6; /*clk divider */
UINT8 ediv8 :1; /*clk /8 prescaler enable */
UINT8 edivld :1; /*clock divider loaded flag */
}bit;
}tECLKDIV;
typedef union uECNFG
{
UINT8 byte;
struct
{
UINT8 :4; /*not used */
UINT8 eswai :1; /*eeprom stopped in wait mode */
UINT8 :1; /*not used */
UINT8 ccie :1; /*command complete interrupt enable */
UINT8 cbeie :1; /*command buffer empty interrupt enable*/
}bit;
}tECNFG;
typedef union uEPROT
{
UINT8 byte;
struct
{
UINT8 ep :3; /*protection block size: (ep+1)*64 bytes */
UINT8 epdis :1; /*protection disable */
UINT8 :3; /*contain value of equivalent bits in
protection byte */
UINT8 eopen :1; /*open block for program/erase */
}bit;
}tEPROT;
typedef union uESTAT
{
UINT8 byte;
struct
{
UINT8 :2; /*not used */
UINT8 blank :1; /*blank verify flag */
UINT8 :1; /*not used */
UINT8 accerr :1; /*access error flag */
UINT8 pviol :1; /*protection violation flag */
UINT8 ccif :1; /*command complete interrupt flag */
UINT8 cbeif :1; /*command buffer empty interrupt flag */
}bit;
}tESTAT;
typedef union uECMD
{
UINT8 byte;
struct
{
UINT8 mass :1; /*mass erase enable*/
UINT8 :1; /*not used */
UINT8 erver :1; /*erase verify enable */
UINT8 :2; /*not used */
UINT8 prog :1; /*word programming */
UINT8 erase :1; /*erase control */
UINT8 :1; /*not used */
}bit;
}tECMD;
typedef struct /*eeprom datastructure */
{
volatile tECLKDIV eclkdiv; /*eeprom clock divider register */
UINT8 rsvee1[2]; /*reserved */
volatile tECNFG ecnfg; /*eeprom configuration register */
volatile tEPROT eprot; /*eeprom protection register */
volatile tESTAT estat; /*eeprom status register */
volatile tECMD ecmd; /*eeprom command buffer & status register */
UINT8 rsvee2[5]; /*reserved */
}tEEPROM;
/************************* Extern Variables **********************************/
/************************* #Defines ******************************************/
#define EDIV8 0x40 /*bit masks */
#define EDIVLD 0x80
#define ESWAI 0x10 /*bit masks */
#define CCIE 0x40
#define CCBIE 0x80
#define EP0 0x01 /*bit masks */
#define EP1 0x02
#define EP2 0x04
#define EP 0x07 /*ep block mask */
#define EPDIS 0x08
#define EOPEN 0x80
#define BLANK 0x04 /*bit masks */
#define ACCERR 0x10
#define PVIOL 0x20
#define CCIF 0x40
#define CBEIF 0x80
#define MASS 0x01 /*bit masks */
#define ERVER 0x04
#define PROG 0x20
#define ERASE 0x40
/************************* Prototypes ****************************************/
void ConfigECLKDIV(void);
UINT8 ProgEeprom(UINT16*, UINT16*, UINT16);
#endif /* End of Header file !defined */


/******************************************************************************
File Name : mcucfg.h
******************************************************************************/
#ifndef MCUCFG_H
#define MCUCFG_H
/************************* System Include Files ******************************/
/************************* Project Include Files *****************************/
#include "stdtypes.h"
/************************* typedefs ******************************************/
/************************* Extern Variables **********************************/
/************************* #Defines ******************************************/
/* Oscillator frequency in kHz */
#define OSCCLK_FREQ_KHZ 16000L /* must have "L" appended for
F/ECLK_PRESCALER macro */
/* register values for PLL */
#define REFDV1 15 /* fref = fosc / (REFDV+1) */
#define SYNR1 24 /* fbus = fref*(SYNR+1) */
/* Bus frequency in kHz */
#define BUSCLK_FREQ_KHZ OSCCLK_FREQ_KHZ*(SYNR1+1)/(REFDV1+1)
/* register base address */
#define REG_BASE 0x0000
/************************* Macros ********************************************/
/************************* Prototypes ****************************************/
#endif /* End of Header file !defined */

/******************************************************************************
File Name : $RCSfile: stdtypes.h
******************************************************************************/
#ifndef STDTYPES_H
#define STDTYPES_H /* this file */
/******************************************************************************
These defines allow for easier porting to other compilers. If porting change
these defines to the required values for the chosen compiler.
******************************************************************************/
typedef unsigned char UINT8; /* unsigned 8-bit */
typedef unsigned int UINT16; /* unsigned 16-bit */
typedef unsigned long UINT32; /* unsigned 32-bit */
typedef signed char INT8; /* signed 8-bit */
typedef int INT16; /* signed 16-bit */
typedef long int INT32; /* signed 32-bit */
/******************************************************************************
Standard Definitions
******************************************************************************/
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
/******************************************************************************
Standard Enumerations
******************************************************************************/
#endif /* End of Header file !defined */

При записи слова в память EEPROM функция постоянно возвращает ошибку, из за того что после команды записи проверяя бит estat.bit.accerr он равен 1. (The ACCERR flag indicates an illegal access has occurred to the Flash memory)

Подскажите как быть?????
puhovick
подскажи, а чем читаешь-пишешь XDP?
sway
Цитата(puhovick @ Jun 3 2008, 13:06) *
подскажи, а чем читаешь-пишешь XDP?
Прогу пишу в CodeWarrior, ну и соответственно с помощью примочки USB-MultiLink программирую и отлаживаю прогу. Ты это имел ввиду???
Но можно также программировать и с не использую USB-MultilLink, помоему через COM-порт... ну вообщем точно не скажу.
Вот есть файлик описывающий Serial Bootloader for Reprogramming
the MC9S12DP256, вроде бы как я понял должен подходить и для XDP.
puhovick
у меня LPT Multilink
пока не пробовал именно XGATE писать и читать
там он в списке есть
хотел бы более удобный программатор найти для этого семейства
sway
Цитата(puhovick @ Jun 10 2008, 18:51) *
у меня LPT Multilink
пока не пробовал именно XGATE писать и читать
там он в списке есть
хотел бы более удобный программатор найти для этого семейства
Я так понимаю у тебя программатор который через JTAG прошивает??? Я просто с таким сталкивался для семейства 56F83xx, норм работает))))). А вот с XDP не все так замечательно как с 56F83xx, уже не знаю что с этой eeprom памятью делать, уже как можно извращался не как работать не хочет, у меня складывается впечатление что я все таки что та упустил(((((((((((
puhovick
я имел ввиду простой BDM
sway
Цитата(puhovick @ Jun 16 2008, 22:08) *
я имел ввиду простой BDM

Ну я программирую и просматриваю через USB Multilink, ну там тоже простой BDM
sway
Ну все таки по сути проблемы помочь ни кто не может???????????????

Я на некоторое время из работы не занимался этим вопросом, сейчас приступил к решению его заново, поэтому буду очень благодарен если кто нибудь окажет мне помощь...............
Заранее благодарен )))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.