pic18f26k22 i2c
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
pic18f26k22 i2c
Доброго времени суток. Мелкими шагами я продвигаюсь в изучении 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 стр. и не очень понимаю написаное)
Что я имею?
По 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
Откуда это известно, еслиKyJek писал(а):ничего путного не выходит
?KyJek писал(а):никаких анализаторов у меня нет мне сложно понять, когда мой код работает а когда нет
Может у Вас всё работает, но Вы об этом не знаете.
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: pic18f26k22 i2c
У меня к мк подключён дисплей, всю интересующую меня информацию вывожу на него. В данном случае я даже не знаю как инициализировать i2c не говоря о том что получить данные!
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: pic18f26k22 i2c
Это хорошо что вы не забросили тему с приёмником.KyJek писал(а):....мне необходимо настроить mssp1 сказать что это i2c. какую мне выбрать скорость....
----
После того как переназначили SCL и SDA на вход - в вашем случае, нужно включить питание MSSP1 (PMDx) и прописать в регистры (названия регистров без "SET") зти значения (следите за банками памяти!):
Спойлер
Код: Выделить всё
#define SETSSP1CON1 B'00101000'
#define SETSSP1CON2 B'00000000'
#define SETSSP1CON3 B'00000000'
#define SETSSP1ADD .40!!! Посмотрите в документации почему я предлагаю прописать именно эти значения.
Как работает MSSP по записи/чтению и "что и как происходит" - смотрите стр. 243 и 245.
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: pic18f26k22 i2c
Итак, что я вижу.
Для включения 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
Для включения 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
Продолжаю разбираться и первой подпрограммой мне необходимо реализовать ожидание 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.
Для записи
Для этого воспользуюсь прерыванием.
Флаг прерывания храниться в регистре 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
Не понимаю тех, кто специально тормозит выполнение программы.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
Полностью с Вами согласен. На данный момент мне важнее понять как отправить и получить данные нежели следить за ходом цикла работы системы в целом.
Я правильно понимаю что записав в ssp1buf число i2c отправит его si и вернет ответ в ssp1buf подняв флаг прерывания ?
Я правильно понимаю что записав в ssp1buf число i2c отправит его si и вернет ответ в ssp1buf подняв флаг прерывания ?
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: pic18f26k22 i2c
Именно так.
На стр. 243 и 245 даже стелочками указана последовательность что и когда происходит.
А тестовая информация, в вашем случае, была бы очень полезной.
На стр. 243 и 245 даже стелочками указана последовательность что и когда происходит.
Если застрянете на ожидании флага - вы ничего не сможете отобразить на дисплее!KyJek писал(а):...На данный момент мне важнее понять как отправить и получить данные нежели следить за ходом цикла работы системы в целом....
А тестовая информация, в вашем случае, была бы очень полезной.
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: pic18f26k22 i2c
Судя по графикам, бит SEN регистра SSP1CON2 начинает цикл записи.
т.е. изначально SEN должен быть 1. потом записать в ssp1buf команду и опустить SEN в 0.
ждать прерывание пока SSP1IF не станет 1 и отработает прерывание которое запишет значение из ssp1buf в временную переменную, которую я отработаю в главном цикле не тормозя работу мк.
( в каком регистре указываются разрешения по прерываниям ? )
т.е. изначально SEN должен быть 1. потом записать в ssp1buf команду и опустить SEN в 0.
ждать прерывание пока SSP1IF не станет 1 и отработает прерывание которое запишет значение из ssp1buf в временную переменную, которую я отработаю в главном цикле не тормозя работу мк.
( в каком регистре указываются разрешения по прерываниям ? )


