EugenOS

Iar, 78K0S, Проблемы С Selfflashprogramming (Эмуляция Eeprom)

1 сообщение в этой теме

EugenOS    1

Знатоки NEC подскажите в чем проблема. Имею такую проблему.

Портировал в ИАР нековский пример эмулятора еепром на uPD78F9234. Если загружаю программу в контроллер из под ИАРа(тогда загружается код дебагера), все работает.

Если же беру HEX (.a26) и заливаю его в контррллер, то блок данных записывает, но функция записи возвращает false (0) как будто запись не удалась. Просматриваю память - данные на месте (записаны без ошибок).

Вот здесь в tst без кода отладчика появляется 0.

eeBuffer.ee_data.id = rxBuffer.sub_cmd;
eeBuffer.ee_data.delimiter = 0;
cpy64( eeBuffer.ee_data.data, rxBuffer.data );
tst = eeprom_write( &eeBuffer.ee_data );

то же самое (дизасм):

;			 eeBuffer.ee_data.id = rxBuffer.sub_cmd;
 1335	 255E		 MOV	 A, S:rxBuffer+1			 ; (0xFE5E)
 1337	 E568		 MOV	 S:eeBuffer, A			    ; (0xFE68)
;			 eeBuffer.ee_data.delimiter = 0;
 1339	 F05FFE	   MOVW    AX, #rxBuffer+2	   ; (0xFE5F)
 133C	 F57100	   MOV	 S:0xFE71, #0x00
;			 cpy64( eeBuffer.ee_data.data, rxBuffer.data );
 133F	 E4		   MOVW    BC, AX
 1340	 F069FE	   MOVW    AX, #eeBuffer+1	   ; (0xFE69)
 1343	 225116	   CALL    cpy64						 ; (0x1651)
;			 tst = eeprom_write( &eeBuffer.ee_data );
 1346	 F068FE	   MOVW    AX, #eeBuffer		  ; (0xFE68)
 1349	 220202	   CALL    eeprom_write			 ; (0x0202)
 134C	 0AE5		 MOV	 C, A
; в других вариантах вместо tst (оптимизировало в регистр С)был сразу if, но результат был тот же. работает так, будто там false

вот исходный код eeprom_write (слегка модифицированный код из примеров NEC, просто там они использовали тип bit, которого нет в IAR):

;-------------------------------------------------------------------
; Function name: __eeprom_write (user access function)
; Input: AX = Structure pointer
; Return value: CY = 0(Normal completion) or CY = 1 (abnormal completion)
; Summary: Writes data with specified number from the storage address to EEPROM.
; 1. Searches for blocks being used as EEPROM.
; 2. If there are no valid blocks, the first specified block is set as valid.
; 3. Searches for addresses to enable writing to valid block.
; 4. If the valid blocks are full and cannot be written to, the operation moves to the next block.
; 5. Creates write data.
; 6. Writes to valid blocks.
;-------------------------------------------------------------------
;bit _eeprom_write(struct_eeprom_data *)
eeprom_write:
PUSH HL
PUSH DE
PUSH BC
CALL getpara   ; Decomposes parameter from argument
CALL SelfFlashModeOn  ; Sets flash mode
CALL EEPROMUseBlockSearch  ; Searches block currently used as EEPROM
BNC  EP_WRITE_WTS   ; Branches if currently used blocks are found
;
; Starts using new block because no currently used blocks are found
;
CALL EEPROMBlockInit  ; If no currently used blocks are found, sets block with
						    ; smallest number specified as EEPROM as valid block
BC  EP_WRITE_FL   ; Branches and completes if securing has failed
EP_WRITE_2:
MOVW AX,#EEPROM_BLOCK*100H+DATATOP
MOV CurentB_No,A   ; Determines block number to be used
;
; Data write processing
;
EP_WRITE_SELF:
MOVW  DE,AX    ; Sets current write address to DE
MOVW AX,RWPointer   ; Reads structure address
XCHW AX,DE    ; Sets structure address to DE
MOV  C,#LENG
CALL FlashEEPROMWrite  ; Writes data to EEPROM
BZ  EP_WRITE_TR
EP_WRITE_FL:
CALL SelfFlashModeOff  ; Releases flash mode
MOV	 A,0		    ; Return value = Abnormal completion (FALSE)
BR   EP_WRITE_E
;
; If current block is valid
;
EP_WRITE_WTS:
CALL EEPROMWriteTopSearch  ; Searches writable area
BNC  EP_WRITE_SELF		    ; Goes to data writing because area was found
;
; Moves to next block because there is no free space in area
;
CALL EEPROMUseBlockChange  ; Changes used block
BC  EP_WRITE_FL   ; Exits with abnormal completion
EP_WRITE_TR:
CALL SelfFlashModeOff  ; Releases flash mode
MOV  A,1    ; Return value = Normal completion (TRUE)
EP_WRITE_E:
POP BC
POP DE
POP HL
RET
;-------------------------------------------------------------------
getpara:
MOVW HL,AX  ; Sets Structure pointer to HL
MOVW RWPointer,AX ; Copies to work area
MOV  A,[HL]  ; Reads data number
MOV  RQDATA_No,A ; Copies to work area
INCW HL  ; Sets data address to HL
RET
;-------------------------------------------------------------------
; Function name: FlashEEPROMWrite
; Input: DE = Write start address
; C = Number of data blocks to be written
; AX = Write data storage address
; Output: Z(ZeroFlag) = Normal completion (1) or abnormal completion (0)
; Registers used: D, E
; Summary: Writes data to EEPROM and internally verifies the data.
;-------------------------------------------------------------------   
FlashEEPROMWrite:
PUSH HL
PUSH AX
PUSH BC
MOVW HL,AX				   ; AX = Write data storage address
MOV  FLCMD,#CMD_BYTE_WRITE  ; Sets flash control command (byte write)
FL_WR_W1:
MOVW AX,HL
MOV  FLAPH,A
XCH  A,X
MOV  FLAPL,A    ; Sets write/verify address
MOV  A,[DE]
MOV  FLW,A    ; Sets write data
CALL SubFlashSelfPrg
BZ  FL_WR_W2   ; Exits if normal completion
POP  BC		 
BR  FL_WR_E
FL_WR_W2:
INCW  DE    ; Read address + 1
INCW HL    ; Write address + 1
DBNZ C,FL_WR_W1   ; Loops for specified number of bytes
POP  BC    ; C = Number of data blocks to be written
POP  AX    ; Loads write data storage address ; AX = Write data storage address
PUSH AX    ; Saves write data storage address
MOV  FLCMD,#CMD_INTERNAL_VERIFY2  ; Sets flash control command (internal verify)
MOV  FLAPH,A
XCH  A,X
MOV  FLAPL,A    ; Sets verify start address
DEC  C
ADD  A,C
XCH  A,X
ADDC A,#0
MOV  FLAPHC,A
XCH  A,X
MOV  FLAPLC,A   ; Sets verify end address
CALL SubFlashSelfPrg   
FL_WR_E:
POP  AX
POP  HL
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Код не весь, смысла весь приводить не вижу. раз данные записываются, значит попадаем в функцию FlashEEPROMWrite. Пробовал из нее убрать ту часть где производится верификация данных. Результат неизменен.

post-42854-0-61438500-1405580332_thumb.jpg

вот все различия в данных записываемых в контроллер (ну плюс еще 300 байт отладчика в конце памяти). Как видим это вектор ресета, вектор INTP3 которым порльзуется дебагер и одна ячейка таблицы CALLT которой так же пользуется дебагер. По-видимому отличия в инициализации сказываются на работе с флешь памятью.

Вот моя процедура инициализации (вызываю в main в самом начале):

void hwinit(void)
{
   asm("DI");
   unsigned char ucCnt200us;
   PCC = 0; // fxp (= fx/4 = 2 MHz)
   LSRCM = 1; /* Stop the oscillation of the low-speed internal oscillator */   
   if (!(RESF & 0x01))
   { /* Omit subsequent LVI-related processing during LVI reset */
  LVIS = 0x0; /* Set the low-voltage detection level (VLVI) to 4.3 V +-0.2 V */
  LVION = 1; /* Enable the low-voltage detector operation */
  for (ucCnt200us = 0; ucCnt200us < 9; ucCnt200us++)
  { /* Wait of about 200 us */
	  asm("NOP");
  }
  while (LVIF){ /* Wait for VDD >= VLVI */
    asm("NOP");
  }	
  LVIMD = 1; /* Set so that an internal reset signal is generated when VDD < VLVI */
   }
   PPCC = 0x0; // The clock supplied to the peripheral hardware (fxp) = fx (= 8 MHz)   
   P0 = 0x0;
   PM0 = 0xF0;
   P2 = 0x00;
   PM2 = 0xF0;
   P3 = 0x00;
   PM3 = 0xF0;
   P4 = 0x38;
   PM4 = 0x10;
   P12 = 0x0F;
   PM12 = 0xF1;
   P13 = 0x00;
   MK0 = 0xFF; // all Intr disabled
   MK1 = 0xFF; // all Intr disabled

   setupTimerT80(  tcl80_DIV64, 126 );
   enableT80Interrupt();
   uartSetup( fXPdiv2, 208, noParity | use8DataBits );
   ASICL6_bit.no0 = 1; // inverted TxD;
   uartEnableRxInt();
   uartEnableErrInt();

   //initWdt( wcsIntOsc | wtv262144 );
   initWdt( wcsStop );// пока отключил WDT   
   clrWdt();
   IF0 = 0x00;
   asm("EI");  
}

Сижу читаю (до дыр) даташиты...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • не исключает подбора Это всё моя лень: проще даже полчаса времени потратить для разработки схемы с карандашом на бумаге, чем 5 минут подбирать... Проще поставить ЛМ по питанию. Но подбирать режим ОУ в зависимости от применённого микрофона и напряжения питания в угоду упрощения схемы на половину десятка мелких деталей и разводки платы... А схема вполне пригодна для ЦМ и с Скор., и без неё. Я ж не против! С уважением В. ПС. На научность никогда не претендовал. Но моя лень давно научила рассуждать конструктивно.
    • Значит Вы ошиблись с сайтом. Особенно с WD. Она обладает не только смазывающими свойствами, но и формирует защитную пленку, которая при высыхании не уступает (по трению) канифоли. А про "силиконку" я говорил не ту, что в тюбиках, а про ту, которая в баллонах с распылителем.
    • @willowasbest , Вы возмущаетесь абсолютно зря. Ограничение полосы воспроизводимых частот ОУ зависит не от цепей коррекции, а от частотных свойств самого ОУ. http://forum.cxem.net/index.php?/blogs/entry/323-быстродействие-оу-по-сравнению-с-компараторами/ Конечно, встречал. Я же ссылку и давал: http://cxem.net/sound/soundpred/soundpred37.php
    • Много зависит от прокладки... между рулём и сидением.  А вы думаете, что во времена Великого исхода даже примитивной техники не было? Крест для распятия не ножичком выстругали, нужны инструменты... плюс дерево не простое. Он состоял из трех пород дерева: кипариса, певга (сосна или ель), кедра. Прообразовательное указание на это содержится в книге пророка Исаии: «Слава Ливана придет к тебе, кипарис и певг и вместе кедр, чтобы украсить место святилища Моего, и Я прославлю подножие ног Моих» (Ис. 60: 13).  Прокуратор сидел в здании, значит были строительные инструменты и приспособления. Оружие и колесницы тоже не пальцем деланы... ткань одежды нужно соткать, одежду чем то сшить... посуда и скарб не с дерева упала...
    • Либо режиссеры полные дебилы, либо они народ за баранов держат... Хотя, при современном высшем образовании, ни у кого не возникает вопросов "куда девается объем газа и давление, при схлопывании пузырьков в кишечнике от эспумизана".
    • Драйверы-стабилизаторы тока можно совершенно спокойно соединять параллельно. 5 штук по 36 Вт дадут Вам 180 Вт. Зато ничего больше не сгорит. И напряжение питания светодиода - параметр справочный, чтобы драйвер мог его обеспечить. Главное - ток.
    • Интересное сообщение, Но не у всех есть сим14, а схему с изменениями можно прикрепить, благодарю. А что с реакцией БП на кз при такой доработке?