pic18f26k22 i2c

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

pic18f26k22 i2c

Сообщение KyJek »

Доброго времени суток. Мелкими шагами я продвигаюсь в изучении PIC и очередной шаг это I2c.

Что я имею?
По i2c я буду связываться с si4703.

выводы соединил так:
PIC - SI
RC3 - SCLK
RC4 - SDIO
RC5 - SEN
RC6 - RST
RA3 - GPIO2

по документации на si приложенной ниже указано, что сначала необходимо сказать ей по какому интерфейсу мы будем с ней взаимодействовать.
На странице 20 документации я нахожу таблицу 9

Я использую двух проводной интерфейс поэтому выбираю Selecting 2-Wire bus mode
начальное состояние выводов
bcf _si_scl
bcf_si_sdio
bcf _si_rst
bsf _si_sen
немного жду и как указано в документации All parameters applied on rising edge of RST. поднимаю ресет
bsf _si_rst
перевожу линии _si_scl и _si_sdio на вход.
Дальше необходимо сконфигурировать i2c интерфейс на контролере. И хотя бы попробовать считать значения регистров 00h и 01h. В них храниться device ID, Chip ID. поскольку никаких анализаторов у меня нет мне сложно понять, когда мой код работает а когда нет, ничего путного не выходит.
Как мне организовать работу i2c? Какие регистры необходимо настроить для корректного взаимодействия?

мне необходимо настроить mssp1 сказать что это i2c. какую мне выбрать скорость.
( читаю дш I2C MASTER MODE TRANSMISSION 242 стр. и не очень понимаю написаное)
Вложения
Si4702-03-C19.pdf
(314.67 КБ) 290 скачиваний
PIC18F2X_4XK22.pdf
(4.13 МБ) 316 скачиваний
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: pic18f26k22 i2c

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

KyJek писал(а):ничего путного не выходит
Откуда это известно, если
KyJek писал(а):никаких анализаторов у меня нет мне сложно понять, когда мой код работает а когда нет
?
Может у Вас всё работает, но Вы об этом не знаете.
Реклама
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: pic18f26k22 i2c

Сообщение KyJek »

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

Re: pic18f26k22 i2c

Сообщение Albert_V »

KyJek писал(а):....мне необходимо настроить mssp1 сказать что это i2c. какую мне выбрать скорость....
Это хорошо что вы не забросили тему с приёмником. :beer:
----
После того как переназначили SCL и SDA на вход - в вашем случае, нужно включить питание MSSP1 (PMDx) и прописать в регистры (названия регистров без "SET") зти значения (следите за банками памяти!):
Спойлер

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

#define	SETSSP1CON1	B'00101000'
#define	SETSSP1CON2	B'00000000'
#define	SETSSP1CON3	B'00000000'
#define	SETSSP1ADD	.40
Всё. Периферия (MSSP1) сконфигурена.
!!! Посмотрите в документации почему я предлагаю прописать именно эти значения.
Как работает MSSP по записи/чтению и "что и как происходит" - смотрите стр. 243 и 245.
Реклама
Эиком - электронные компоненты и радиодетали
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: pic18f26k22 i2c

Сообщение KyJek »

Итак, что я вижу.
Для включения MSSP1 отвечает 6-бит регистра PMD1 с названием MSSP1MD.
Включенным считается, когда он равен 0. Кроме него ничего включать не надо поэтому
MOVLW B'10111111'
MOVWF PMD1
Переходим к настройке.
#define SET_SSP1CON1 B'00101000'
Первые 4 бита говорят о выборе 1000 = I2C Master mode, clock = FOSC / (4 * (SSPxADD+1))
Мастер мод понятен, мы будем управлять Si поэтому мы главные. Частота равна частоте мк деленной на (4* 41)
Так же есть пометка SSPxADD values of 0, 1 or 2 are not supported for I2C Mode
Бит 4 CKP: Clock Polarity Select bit для мастер мода вообще не используется потому он 0
Бит 5 SSP1EN равен 1 = Enables the serial port and configures the SDAx and SCLx pins as the source of the serial port pins
Конфигурит ножки для работы с портом. Есть пометка When enabled, the SDAx and SCLx pins must be configured as inputs.
Но я уже и так настроил их на вход.
Бит 6 SSP1OV отвечает за переполнение и что значит No overflow. Нет переполнения я не очень понял.
Бит 7 WCOL включает определение коллизии на линии. 0 значит, нет определения коллизий?
Переходим к регистру ssp1con2 все его биты равны 0, а это значит
Бит0 SEN Start Condition Enabled bit (in I2C Master mode only) мастер мод как раз у нас
И при нем мы выбираем 0 = Start condition Idle. Что такое Idle я не понял.
Бит1 RSEN 0 = Repeated Start condition Idle повторяет запуск условия Idle.
Бит 2 PEN 0 = Stop condition Idle останавливает Idle.
Бит 3 RCEN 0 = Receive idle получает Idle.
Бит 4 ACKEN 0 = Acknowledge sequence idle Подтверждает последовательность Idle.
Бит 5 ACKDT 0 = Acknowledge при получении данных необходимо сказать, что все получено в конце
Бит 6 ACKSTAT 0 = Acknowledge was received отвечает за то что все было получено если = 0 и 1 если нет.
Бит 7 GCEN 0 = General call address disabled общий адрес вызова выключен и в нашем случае он неважен т.к. имеет значение только в (in I2C Slave mode only)
Регистр ssp1con3 по большей части наделен битами для I2C Slave mode поэтому нам не важны их значения однако
Бит 3 SDAHT 0 = Minimum of 100 ns hold time on SDAx after the falling edge of SCLx не очень понял
0 = Минимум времени задержки на 100 нс над SDAx после убывающего фронта SCLx. Задержка по убывающему фронту ?
6 и 5 биты PCIE и SCIE Stop detection interrupts are disabled и Start detection interrupts are disabled
Остановка и старт отслеживания прерываний отключены.
Бит 7 ACKTIM 0 = Not an Acknowledge sequence, cleared on 9th rising edge of SCLx clock не очень понимаю
Не Подтвердить последовательность, очищенная на 9-м нарастающем фронте часов SCLx


Написать инициализацию просто
#define SET_SSP1CON1 B'00101000'
#define SET_SSP1CON2 B'00000000'
#define SET_SSP1CON3 B'00000000'
#define SET_SSP1ADD .40

MOVLW B'10111111'
MOVWF PMD1
MOVLW SET_SSP1CON1
MOVWF SSP1CON1
MOVLW SET_SSP1CON2
MOVWF SSP1CON2
MOVLW SET_SSP1CON3
MOVWF SSP1CON3
MOVLW SET_SSP1ADD
MOVWF SSP1ADD
Реклама
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: pic18f26k22 i2c

Сообщение KyJek »

Продолжаю разбираться и первой подпрограммой мне необходимо реализовать ожидание i2c
Для этого воспользуюсь прерыванием.
Флаг прерывания храниться в регистре PIR1.
Бит 3 этого регистра SSP1IF: Master Synchronous Serial Port 1 Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared by software)
0 = Waiting to transmit/receive
Всегда равен 0 и когда i2c завершит прием или передачу равен 1.

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

I2C _WAIT 
BTFSS PIR1, SSP1IF 	; проверяем флаг прерывания на 1
GOTO I2C _WAIT 		; ждем пока он не 1	
BCF PIR1, SSP1IF 		; сбрасываем флаг в 0
; возможно тут нужно проверять ssp1buf ? 		
RETURN
Для записи

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

I2C _WRITE 
MOVWF SSP1BUF 
CALL I2C _WAIT 
RETURN
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: pic18f26k22 i2c

Сообщение Albert_V »

KyJek писал(а):

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

I2C _WAIT 
BTFSS PIR1, SSP1IF 	; проверяем флаг прерывания на 1
GOTO I2C _WAIT 		; ждем пока он не 1	
BCF PIR1, SSP1IF 		; сбрасываем флаг в 0
; возможно тут нужно проверять ssp1buf ? 		
RETURN
Не понимаю тех, кто специально тормозит выполнение программы.
Неужели так сложно отработать флаг прерывания SSP1IF именно в обработчике прерываний?
А уж каким будет его приоритет, Low или High INT - это уже решать по тому, что важнее отрабатывать при работе в реальном времени.
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: pic18f26k22 i2c

Сообщение KyJek »

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

Я правильно понимаю что записав в ssp1buf число i2c отправит его si и вернет ответ в ssp1buf подняв флаг прерывания ?
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: pic18f26k22 i2c

Сообщение Albert_V »

Именно так.
На стр. 243 и 245 даже стелочками указана последовательность что и когда происходит.
KyJek писал(а):...На данный момент мне важнее понять как отправить и получить данные нежели следить за ходом цикла работы системы в целом....
Если застрянете на ожидании флага - вы ничего не сможете отобразить на дисплее!
А тестовая информация, в вашем случае, была бы очень полезной.
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: pic18f26k22 i2c

Сообщение KyJek »

Судя по графикам, бит SEN регистра SSP1CON2 начинает цикл записи.
т.е. изначально SEN должен быть 1. потом записать в ssp1buf команду и опустить SEN в 0.
ждать прерывание пока SSP1IF не станет 1 и отработает прерывание которое запишет значение из ssp1buf в временную переменную, которую я отработаю в главном цикле не тормозя работу мк.

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

Re: pic18f26k22 i2c

Сообщение Albert_V »

Может так понятнее будет?
Изображение Изображение
"Cleared by hardware" - делает контроллер без вашего участия.
"Cleared by software" - делать вам.
KyJek писал(а):...в каком регистре указываются разрешения по прерываниям ?
Почитайте раздел 9.0 INTERRUPTS.
Ответить

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