Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

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

Чт апр 20, 2017 23:50:30

Блин, да флаг IF нужно проверять, а не BF :)

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

Пт апр 21, 2017 00:01:03

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 не выставляется!!!

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

Пт апр 21, 2017 00:33:40

Аlex писал(а):Блин, да флаг IF нужно проверять, а не BF :)

Если не проверять BF, то на дебагере биты данных что в приеме что в отправке показываются знаком вопроса =)
Но спасибо всем, я решил проблему. В дебагер приходит нужное значение из нужной ячейки, НО, в регистр из буфера копируется что-то непонятное... вот скрин. мое значение 0x05, копирую из буфера в регистр, а туда копируется 0x82...
Изображение

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

Пт апр 21, 2017 00:35:56

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

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

Пт апр 21, 2017 00:39:27

Albert_V писал(а):Мне сложно что-то сказать про ваш дебаггер, поскольку у меня ICD3 (оригинальный) и я работаю с реальным "железом".

Да не в нем дело... Вот отослал я данные, проверил пока отошлются (флаг BF), потом проверяю SSPIF, когда он в единице переписываю данные из регистр и все. Откуда может взяться не то значение? Мне приходит 3 байта, 0xFF,0xFF, и мой 0x05. Все они как я понимаю, приходят в SSPBUF. Так вот, как мне выцепить оттуда именной мой последний байт?
Еще предупреждение пишет
"Data written SSPBUF whilst MSSP (in master mode) is active - data has been ignored"

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

Пт апр 21, 2017 00:47:31

kotbaris1 писал(а):Еще предупреждение пишет

Ну и какого вы забиваете буфер, когда он ещё занят?
Документацию читать будете?

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

Пт апр 21, 2017 01:06:20

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


По моему все в точности как вы говорили.

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

Пт апр 21, 2017 13:44:18

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

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

Сб апр 22, 2017 21:59:31

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      



Изображение

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

Сб апр 22, 2017 22:02:31

После записи в SSPBUF очередного байта - по получению прерывания всё равно (надо или нет) нужно читать SSPBUF!!!
Так видно?

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

Сб апр 22, 2017 22:05:32

Albert_V писал(а):Так видно?
После записи в SSPBUF очередного байта - по получению прерывания всё равно (надо или нет) нужно читать SSPBUF!!!

Читать даже после отправке инструкций в память?

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

Сб апр 22, 2017 22:09:59

Наконец-то поняли.
Именно ТАК (не зависимо от того что передаёте в понимании, в вашем случае, EEPROM-а)!!!

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

Сб апр 22, 2017 22:27:49

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 после передачи инструкций пишутся верно... а с этим баг какой-то

Изображение

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

Сб апр 22, 2017 22:43:29

Почему закомментировано:
;Сбрасываем SSPIF
;bcf PIR1,SSPIF
???

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

Сб апр 22, 2017 22:51:06

Albert_V писал(а):Почему закомментировано:
;Сбрасываем SSPIF
;bcf PIR1,SSPIF
???

Тестил. Оно откоментировано все. проблема не в этом...(

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

Сб апр 22, 2017 22:53:38

В моём примере пробовали разобраться?
Он рабочий (в железе).

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

Сб апр 22, 2017 22:56:58

Albert_V писал(а):В моём примере пробовали разобраться?
Он рабочий (в железе).

Я разобрался как видите. Но как это влияет на то что у меня такая трабла? Или вы что-то еще скрываете?

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

Сб апр 22, 2017 22:59:34

kotbaris1 писал(а):Я разобрался как видите....

Не вижу.
У меня, в отличии от вас, работа по прерыванию и нет проверки SSPSTAT,BF.
Так что, это ваша некая редакция некоего текста программы.

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

Сб апр 22, 2017 23:12:04

Albert_V писал(а):
kotbaris1 писал(а):Я разобрался как видите....

Не вижу.
У меня, в отличии от вас, работа по прерыванию и нет проверки SSPSTAT,BF.
Так что, это ваша некая редакция некоего текста программы.

Так какая разница, прерывание или нет. Вы мне сами говорили, что хоть через задержку делай. Через задержку аналогично все, бит танных по пересылке в регистр битый.
Изображение
Я хз как сделать чтоб оно работало.

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

Сб апр 22, 2017 23:20:56

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