1882ВЕ53У

Модераторы: gurzzza, pip, sya, _sva_

bzzt
Сообщения: 10
Зарегистрирован: 23 апр 2015, 09:33

Re: 1882ВЕ53У

Сообщение bzzt » 20 янв 2016, 11:27

Столкнулись с проблемой в микросхеме выпуска 1536, которой не было в выпущенных ранее 1412.
При страничной записи EEPROM если буфер заполнен не полностью, то записывается только последний байт. Запись в EEPROM по одному байту или полной страницы при этом осуществляется корректно.

Код: Выделить всё

#include "at89s8253.h"

void main (void) {

  unsigned char i;

  PCON &= ~SMOD0_;          // SCON.7 is SM0
  SM0 = 0;                  // UART mode 1
  SM1 = 1;
  SM2 = 1;                  // stop bit validation enabled
  RI = 0;
  TI = 0;
  REN = 1;

  TCLK = 0;                 // timer 1 as baud rate generator
  RCLK = 0;
  PCON |= SMOD1_;
  TH1 = 0xFD;               // 19200 bps @ 11.0592 MHz
  TMOD |= T1_M1_;
  TMOD &= ~T1_M0_;
  TMOD &= ~T1_CT_;
  TR1 = 1;

  EECON |= EEMEN_;          // EEPROM enabled

  EECON |= EEMWE_;          // EEPROM is writable

/* запись одного байта */
  ((unsigned char volatile xdata *)0x0000)[0] = 0xAA;
  while(EECON & RDY_) ;     // wait for write cycle start
  while(!(EECON & RDY_)) ;  // wait for write cycle end

/* запись неполной страницы */
  EECON |= EELD_;           // load enabled
  for(i=0; i<7; i++) ((unsigned char volatile xdata *)0x0020)[i] = i;
  EECON &= ~EELD_;          // load finished
  ((unsigned char volatile xdata *)0x0020)[7] = 7;
  while(EECON & RDY_) ;     // wait for write cycle start
  while(!(EECON & RDY_)) ;  // wait for write cycle end

/* запись полной страницы */
  EECON |= EELD_;           // load enabled
  for(i=0; i<31; i++) ((unsigned char volatile xdata *)0x0040)[i] = i;
  EECON &= ~EELD_;          // load finished
  ((unsigned char volatile xdata *)0x0040)[31] = 31;
  while(EECON & RDY_) ;     // wait for write cycle start
  while(!(EECON & RDY_)) ;  // wait for write cycle end

  EECON &= ~EEMWE_;         // EEPROM is not writable

  for(i=0; i<96; i++) {
    SBUF = ((unsigned char volatile xdata *)0x0000)[i];
    while(!TI) ;
    TI = 0;
  }

  while(1) {
    ;
  }
}
Вывод содержимого EEPROM микросхемы выпуска 1143:
Изображение
Вывод содержимого EEPROM микросхемы выпуска 1536:
Изображение

Sanek
Сообщения: 53
Зарегистрирован: 29 окт 2013, 23:38
Предприятие: НИИЭТ
Откуда: Воронеж

Re: 1882ВЕ53У

Сообщение Sanek » 20 янв 2016, 17:23

Попробуйте вот такую реализацию записи:

/* запись неполной страницы */
EECON |= EELD_; // load enabled
for(i=0; i<8; i++) ((unsigned char volatile xdata *)0x0020) = i;
EECON &= ~EELD_; // load finished
((unsigned char volatile xdata *)0x0020)[31] = 255;
while(EECON & RDY_) ; // wait for write cycle start
while(!(EECON & RDY_)) ; // wait for write cycle end

, то есть по адресам 20h...27h пишем данные 00h...07h, а по адресу 3fh пишем данные ffh

bzzt
Сообщения: 10
Зарегистрирован: 23 апр 2015, 09:33

Re: 1882ВЕ53У

Сообщение bzzt » 21 янв 2016, 09:34

Sanek, запись в EEPROM по адресу ((unsigned char volatile xdata *)0x0020)[31] не означает запись в последнюю ячейку буфера. Таким образом буфер лишь будет дополнен девятым байтом. Проверить сейчас уже не могу. Впрочем, я и не спрашиваю как обойти проблему. Очевидны два выхода: 1) только одиночные записи; 2) операции чтение-модификация-запись 32-байтными фрагментами. В первом случае увеличивается время записи, во втором расходуется лишние 32 байта RAM. Я выбрал первый вариант.

Sanek
Сообщения: 53
Зарегистрирован: 29 окт 2013, 23:38
Предприятие: НИИЭТ
Откуда: Воронеж

Re: 1882ВЕ53У

Сообщение Sanek » 21 янв 2016, 09:49

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

bzzt
Сообщения: 10
Зарегистрирован: 23 апр 2015, 09:33

Re: 1882ВЕ53У

Сообщение bzzt » 21 янв 2016, 09:57

Я понял вашу мысль. Но, записываемый байт попадёт в последнюю ячейку только если буфер перед этим был заполнен 31 байтом, поскольку ячейка буфера определяется счётчиком, а не адресом.

nppsem
Сообщения: 45
Зарегистрирован: 26 апр 2010, 16:09

Re: 1882ВЕ53У

Сообщение nppsem » 25 янв 2016, 14:47

Хочется получить сухой остаток по теме ошибок записи EEPROM viewtopic.php?f=7&p=2621#p2613.
Будет ли корректно выполняться запись 6-ти блоков по 32 разряда по приведённому коду (блоки считываются из внешней XRAM):

Код: Выделить всё

Write_EE_Block:
	clr	EA
	mov	r6,#6	; кол-во записываемых страниц
	orl	EECON,#DPS
	mov	dptr,#EE_BEGIN	; DPTR2 -> EEPROM
	xrl	EECON,#DPS
	mov	dptr,#EE_X_Buf	; DPTR1 -> Xram_Buf

	orl 	EECON, #EEMEN 	; enable EEPROM accesses
	orl 	EECON, #EEMWE 	; enable EEPROM write

next_ee_page:
	mov	r7,#32	; объем страницы 32 байта
	orl 	EECON, #EELD

ee_page_loop:	; загрузка страницы в EEPROM из XRAM
	movx	a,@dptr
	inc	dptr

	orl	EECON,#DPS
	movx	@dptr,a
	inc	dptr
	xrl	EECON,#DPS
	cjne	r7,#2,decr_r7	; т.е. следующий проход крайний на странице, надо переключить EELD
	xrl 	EECON, #EELD
decr_r7:
	djnz	r7,ee_page_loop

; собственно запись страницы
loop1:
	mov 	a, EECON 	; get EEPROM write status
	anl 	a, #RDY 	; check RDY/BSY
	jnz 	loop1 		; jump if not busy yet
loop2:
	mov 	a, EECON	; get EEPROM write status
	anl 	a, #RDY 	; check RDY/BSY
	jz 	loop2 		; jump if busy

; повторить цикл для следующей страницы
	djnz	r6,next_ee_page

; завершение работы с EEPROM
	xrl 	EECON, #EEMEN
	xrl 	EECON, #EEMWE
	setb	EA
	ret

bzzt
Сообщения: 10
Зарегистрирован: 23 апр 2015, 09:33

Re: 1882ВЕ53У

Сообщение bzzt » 25 янв 2016, 15:51

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

nppsem
Сообщения: 45
Зарегистрирован: 26 апр 2010, 16:09

Re: 1882ВЕ53У

Сообщение nppsem » 25 янв 2016, 17:50

Спасибо, успокоили! Мы проверяли запись в EEPROM в конце 15-го года на микросхемах партии 1533, но весьма поверхностно. Можно эту "особенность" в ТО отразить?

bzzt
Сообщения: 10
Зарегистрирован: 23 апр 2015, 09:33

Re: 1882ВЕ53У

Сообщение bzzt » 17 май 2016, 10:26

Прошу специалистов НИИЭТ как-то прокомментировать вышеописанную мною особенность работы EEPROM.

Также интересует чем закончилась вот эта история:
_sva_ писал(а):
AVBerg писал(а):Микроконтроллер используется в серийных изделиях еще со времен 52-го.

В этом году (с 2015) появилась проблема: при срабатывании вблизи коммутационного оборудования самопроизвольно меняется значение битов FUSE.Это приводит к несанкционированному включению опции удвоения и (что особенно расстраивает) снятию бита разрешения программирования по последовательному интерфейсу.
Если удвоение как то лечится- CLKREG=0, то потеря возможности программирования приводит к необходимости замены микросхемы.
Как с Вами связаться? Напишите мне smerek@niiet.ru.
Поскольку у нас тоже были редкие случаи блокировки последовательного программирования

_sva_
Специалист
Сообщения: 202
Зарегистрирован: 12 ноя 2009, 17:42
Откуда: Воронеж
Contact:

Re: 1882ВЕ53У

Сообщение _sva_ » 18 май 2016, 15:05

bzzt писал(а):Прошу специалистов НИИЭТ как-то прокомментировать вышеописанную мною особенность работы EEPROM.

Также интересует чем закончилась вот эта история:
_sva_ писал(а):
AVBerg писал(а):Микроконтроллер используется в серийных изделиях еще со времен 52-го.

В этом году (с 2015) появилась проблема: при срабатывании вблизи коммутационного оборудования самопроизвольно меняется значение битов FUSE.Это приводит к несанкционированному включению опции удвоения и (что особенно расстраивает) снятию бита разрешения программирования по последовательному интерфейсу.
Если удвоение как то лечится- CLKREG=0, то потеря возможности программирования приводит к необходимости замены микросхемы.
Как с Вами связаться? Напишите мне smerek@niiet.ru.
Поскольку у нас тоже были редкие случаи блокировки последовательного программирования
Проблема наблюдалась на некоторых ИС, выпущенных до производственной партии 1540. После - таких случаев зафиксировано не было.

Ответить

Вернуться в «Микроконтроллеры семейства MCS-51»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость