Jump to content

Recommended Posts

Здравствуйте, весь день голову ломаю...Нужно подружить PIC16F72 с Flash-памятью AT45DB161D.  В порядке эксперимента для начала хочу прочитать регистр статуса и идентификатор памяти, но она ничего совсем не отвечает :(.  вот код:

;========== Настройка МК ==============================================
SetMCU		CALL		Pause1s			
			CLRF		STATUS
			CLRF		PORTA
			CLRF		PORTB
			CLRF		PORTC
			BSF			STATUS, RP0		;Банк 1
			MOVLW		b'00000000'		;Значение для направления PORTA
			MOVWF		TRISA			;Настройка PORTA
			MOVLW		b'00000000'		;Значение для направления PORTB
			MOVWF		TRISB			;Настройка PORTB	
			MOVLW		b'00010000'		;Значение для направления PORTC
			MOVWF		TRISC			;Настройка PORTC

;========== Инициализация SPI ===========================================
			BCF			STATUS, RP0		;Банк 0
			CLRF		SSPSTAT			
			MOVLW		b'00100000'		;Значение для настройки SPI
			MOVWF		SSPCON			;Настройка SPI
			BSF			PORTC, 6		;Установка CS0
            
;========== Чтение идентификатора AT45DB161D
			BCF			PORTC, 6		;Опускаем CS
			MOVLW		0x9F			;Опкод для чтения идентификатора
			CALL		SPI_Trans		;Обмен SPI

			MOVLW		0x00			;Ждем ответ
			CALL		SPI_Trans		

			MOVF		SPI_RX,0		;Принятый байт в аккумулятор
			MOVWF		PORTB			;Вывод значения

			BSF			PORTC, 6		;Завершение передачи

stop		GOTO		stop			;Бесконечный цикл

;========== Передача по SPI ======================================================================================================
SPI_Trans	MOVWF		SSPBUF			;Передача байта
			CALL		Pause1ms		;Ожидание завершения передачи
			MOVF		SSPBUF, 0		;Копирование принятого байта
			MOVWF		SPI_RX			
			RETURN	

В протеусе с SPI_Debugger-ом все работает, если подставить на место ответа какое-нибудь значение, оно выводится в портБ. Но в железе с подключенной памятью ничего не происходит. Выводы памяти RESET, WP соединены с питанием. Питание 3,3В. Помогите, пожалуйста)

Edited by Batai

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By duty
      Привет, участникам форума! Подскажите, пожалуйста, как можно реализовать связь микроконтроллера pic с адресным ключом (ds2405 или ds2408) по 1-wire (на шине будут висеть несколько ключей)  для считывания pio ключа, во входном режиме, т.е на pio поступает сигнал  с магнитоконтактного датчика о срабатывание его или нет.    Datasheet читал, но мало чего понял.  Тестирование произвожу в proteus 8.6
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Илья Юрченко
      Добрый день, уважаемые форумчане! Для научной работы хотел собрать данные о том, насколько микроконтроллеры stm32 удовлетворяют нужды и требования программистов и разработчиков продуктов на нем. Если не сложно, ответьте, пожалуйста, важны данные)
      Разумеется "очень средне" неадекватная метрика, но в рамках работы нужна именно средняя удовлетворённость, и определение существует ли необходимость в создании другой серии универсальных плат на базе МК.
    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By Илья Говжеев
      Поделитесь опытом , кто уже пробывал из arduino сделать программатор pic? 

×
×
  • Create New...