Проблемы со SPIMEM. Запись во внешнюю EEPROM

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Блин, да флаг IF нужно проверять, а не BF :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

kotbaris1 писал(а):Можете пример кода показать?
Если разберётесь (вырезка из программы под PIC18F26K22)....
В прерывании:
Спойлер

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

;------------------------------------
HighInt
	movff	STATUS,STATUS_TEMPH
	movff	WREG,WREG_TEMPH
	movff	BSR,BSR_TEMPH
	BANK1
;------------------------------------
	btfsc	PIR3,SSP2IF
	goto	SSP2INT

	goto	HINTEND
;---------------------------------------
SSP2INT
	bcf	PIR3,SSP2IF
;
	bsf	_SSP2INT	; Программный бит (в некоем регистре)
	movf	SSP2BUF,W
	movwf	TEMPSSPBUFF	; Отсюда прочитаете значение SSPBUFF после того, как поднимется программный бит _SSP2INT
;---------------------------------------
HINTEND
;
	movff	BSR_TEMPH,BSR
	movff	WREG_TEMPH,WREG
	movff	STATUS_TEMPH,STATUS
	RETFIE	FAST
;------------------------------------
Ожидание окончания передачи байта в MAIN-е (низший приоритет в программе)
Спойлер

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

;*****************************************************************************
WAITSPI2
	btfss	_SSP2INT
	goto	WAITSPI2
;
	bcf	_SSP2INT
;
	RETURN
;*****************************************************************************
-------
Флаг SSP2IF без разрешения прерывания в PIC18 не выставляется!!!
Реклама
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Аlex писал(а):Блин, да флаг IF нужно проверять, а не BF :)
Если не проверять BF, то на дебагере биты данных что в приеме что в отправке показываются знаком вопроса =)
Но спасибо всем, я решил проблему. В дебагер приходит нужное значение из нужной ячейки, НО, в регистр из буфера копируется что-то непонятное... вот скрин. мое значение 0x05, копирую из буфера в регистр, а туда копируется 0x82...
Изображение
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Мне сложно что-то сказать про ваш дебаггер, поскольку у меня ICD3 (оригинальный) и я работаю с реальным "железом".
------
P.S.
После записи в SSPBUF очередного байта - по получению прерывания всё равно (надо или нет) нужно читать SSPBUF!!!
Последний раз редактировалось Albert_V Пт апр 21, 2017 00:41:45, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):Мне сложно что-то сказать про ваш дебаггер, поскольку у меня ICD3 (оригинальный) и я работаю с реальным "железом".
Да не в нем дело... Вот отослал я данные, проверил пока отошлются (флаг BF), потом проверяю SSPIF, когда он в единице переписываю данные из регистр и все. Откуда может взяться не то значение? Мне приходит 3 байта, 0xFF,0xFF, и мой 0x05. Все они как я понимаю, приходят в SSPBUF. Так вот, как мне выцепить оттуда именной мой последний байт?
Еще предупреждение пишет
"Data written SSPBUF whilst MSSP (in master mode) is active - data has been ignored"
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

kotbaris1 писал(а):Еще предупреждение пишет
Ну и какого вы забиваете буфер, когда он ещё занят?
Документацию читать будете?
Реклама
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):
kotbaris1 писал(а):Еще предупреждение пишет
Ну и какого вы забиваете буфер, когда он ещё занят?
Документацию читать будете?
да когда ж он занят, если SSPIF в 1 стоит. Ошибки той уже нет. я лоханулся с btfss и btfsc
Что именно в коде не так?

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

movlw 0x20
movwf  SSPBUF
sdata40  
clrwdt
BTFSS  SSPSTAT, BF
GOTO   sdata40
btfsc PIR1,SSPIF
goto givemedate
from_givemedate
incf 0x41
bsf TRISA,SS	

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

givemedate

incf 0x30
movf SSPBUF,W
movwf 0x45
bcf PIR1,SSPIF
goto from_givemedate
По моему все в точности как вы говорили.
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Выше я дал вам пример кода.
Если не поняли, после записи байта в SSPBUF надо "сказать" CALL WAITSPI2 и ждать выхода из подпрограммы (и, естественно, в тексте нужно подправить названия регистров).
Не пропустили в моём тексте про то, что нужно всегда читать SSPBUF после окончания передачи байта?
Если хотите трахаться с программой ещё два месяца продолжать проверять флаг SSPSTAT,BF - это ваше право.
-----
P.S.
Специально для вас:
Можете вообще никаких флагов не проверять, поставив "тупую задержку в цикле" после записи байта в SSPBUF на время передачи байта по SPI умноженное на 1,5. :)))
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):Выше я дал вам пример кода.
Если не поняли, после записи байта в SSPBUF надо "сказать" CALL WAITSPI2 и ждать выхода из подпрограммы (и, естественно, в тексте нужно подправить названия регистров).
Не пропустили в моём тексте про то, что нужно всегда читать SSPBUF после окончания передачи байта?
Если хотите трахаться с программой ещё два месяца продолжать проверять флаг SSPSTAT,BF - это ваше право.
-----
P.S.
Специально для вас:
Можете вообще никаких флагов не проверять, поставив "тупую задержку в цикле" после записи байта в SSPBUF на время передачи байта по SPI умноженное на 1,5. :)))
Эхехехе. Вы, помоему, мне так и не сможете помочь.
Реализация с задержкой. На выходе в SSPBUF лежит 0xA2, а не 0x45!!! Которое показано, что принялось. Аналогичный результат я кидал выше, с проверкой флага SSPIF, где вы сказали, что не надо проверять BF. В даташите написано, что BF проверяется чтобы понять произошла ли запись в буфер. Если его не проверять, а проерять просто SSPIF, то нихрена не пересылается и не принимается вообще.
Вот реализация с задержкой. А ниже скрин, какое число должно быть получено, а какое итогу лежит в регистре.
Спойлер

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

movlw 0x00
bcf TRISA,SS
movlw 0x03	
MOVWF  SSPBUF 
instrycd
clrwdt
BTFSS  SSPSTAT, BF  
GOTO   instrycd
;передача адрес по которому читаем
movlw 0x02
MOVWF  SSPBUF 
adrd 
clrwdt
BTFSS  SSPSTAT, BF  
GOTO   adrd

	
;передаем 0 чтобы было тактирование
movlw 0x00
movwf  SSPBUF
sdata40  
clrwdt
BTFSS  SSPSTAT, BF
GOTO   sdata40
call WAIT
movf SSPBUF,W
movwf 0x45
;btfsc PIR1,SSPIF
;goto givemedate
;from_givemedate
incf 0x41
bsf TRISA,SS
......
......
;получаем данные из памяти
;givemedate
;movf SSPBUF,W
;movwf 0x45
;incf 0x30
;bcf PIR1,SSPIF
;goto from_givemedate		

Изображение
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

После записи в SSPBUF очередного байта - по получению прерывания всё равно (надо или нет) нужно читать SSPBUF!!!
Так видно?
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):Так видно?
После записи в SSPBUF очередного байта - по получению прерывания всё равно (надо или нет) нужно читать SSPBUF!!!
Читать даже после отправке инструкций в память?
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Наконец-то поняли.
Именно ТАК (не зависимо от того что передаёте в понимании, в вашем случае, EEPROM-а)!!!
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):Наконец-то поняли.
Именно ТАК (не зависимо от того что передаёте в понимании, в вашем случае, EEPROM-а)!!!
Сделал так. Но результат аналогичен -- пишет 0xA2 в регистр, а не 0x45.... Читаю SSPBUF после каждой отправки данных --
Проверяю установку SSPIF в 1, потом читаю SSPBUF.
Спойлер

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

;передача инструкции на чтение
bcf TRISA,SS	
movlw 0x03	
MOVWF  SSPBUF 
instrycd
clrwdt
BTFSS  SSPSTAT, BF  
GOTO   instrycd
;Ждем пока установится SSPIF в 1			
SSP1
btfss PIR1,SSPIF
goto SSP1
;Читаем SSPBUF
movf SSPBUF,W
movwf 0x45
;Сбрасываем SSPIF
;bcf PIR1,SSPIF
				
;передача адрес по которому читаем
movlw 0x02
MOVWF  SSPBUF 
adrd 
clrwdt
BTFSS  SSPSTAT, BF  
GOTO   adrd
;Ждем пока установится SSPIF в 1			
SSP2
btfss PIR1,SSPIF
goto SSP2
;Читаем SSPBUF
movf SSPBUF,W
movwf 0x45			
;Сбрасываем SSPIF
;bcf PIR1,SSPIF	
				
				
;передаем 0 чтобы было тактирование
movlw 0x00
movwf  SSPBUF
sdata40  
clrwdt
BTFSS  SSPSTAT, BF
GOTO   sdata40
;Ждем пока установится SSPIF в 1			
SSP3
btfss PIR1,SSPIF
goto SSP3
;Читаем SSPBUF
movf SSPBUF,W
movwf 0x45
;Сбрасываем SSPIF
;bcf PIR1,SSPIF
bsf TRISA,SS	
причем байты sspbuf после передачи инструкций пишутся верно... а с этим баг какой-то

Изображение
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Почему закомментировано:
;Сбрасываем SSPIF
;bcf PIR1,SSPIF
???
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):Почему закомментировано:
;Сбрасываем SSPIF
;bcf PIR1,SSPIF
???
Тестил. Оно откоментировано все. проблема не в этом...(
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

В моём примере пробовали разобраться?
Он рабочий (в железе).
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):В моём примере пробовали разобраться?
Он рабочий (в железе).
Я разобрался как видите. Но как это влияет на то что у меня такая трабла? Или вы что-то еще скрываете?
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

kotbaris1 писал(а):Я разобрался как видите....
Не вижу.
У меня, в отличии от вас, работа по прерыванию и нет проверки SSPSTAT,BF.
Так что, это ваша некая редакция некоего текста программы.
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 21, 2015 23:33:35

Сообщение kotbaris1 »

Albert_V писал(а):
kotbaris1 писал(а):Я разобрался как видите....
Не вижу.
У меня, в отличии от вас, работа по прерыванию и нет проверки SSPSTAT,BF.
Так что, это ваша некая редакция некоего текста программы.
Так какая разница, прерывание или нет. Вы мне сами говорили, что хоть через задержку делай. Через задержку аналогично все, бит танных по пересылке в регистр битый.
Изображение
Я хз как сделать чтоб оно работало.
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Переводной документацией не пользуюсь.
Ваш пример - это, похоже, работа в режиме Slave.
Прочтите программатором вашу 25AA040 и выложите что там сейчас прописано.
----
P.S.
Если есть логический анализатор - выкладывайте "захват" SPI.
Последний раз редактировалось Albert_V Сб апр 22, 2017 23:27:52, всего редактировалось 1 раз.
Ответить

Вернуться в «PIC»