![]() |
|
|
Продукция MICROCHIP Технические вопросы по всей продукции Microchip |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
|
![]()
Вот нашел интересную статью, может кому сгодиться:
Interfacing the Microchip PIC18F Microcontroller Master Synchronous Serial Port (MSSP) to various I2C Devices |
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 08.06.2007
Сообщений: 528
Вес репутации: 838/59 ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
А кто-нибудь использовал утилиту
"MCP2221 I2C SMBus Terminal" + mcp2221 чип для отладки усторойства с I2C ? |
![]() |
![]() |
![]() |
#3 |
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Господа, ткните пожалуйста носом в примеры чтения по I2C двухбайтовых регистров из слейв устройств для PIC16. В какой-нибудь более или менее читаемый исходник: с полным кодом в одном файле (без отсылок к подключаемым файлам, которые порой отсутствуют в самих примерах), желательно с русскими комментами (не на корявом русском английском, которые сами авторы прочитать не в состоянии через неделю после написания).
Что-то такое, где наглядно (в столбик) было показано, что делать с битами регистров управления I2C PIC16 в ходе обращения МК к слейву. Как адресуется чип, как адресуется регистр, как читаются первый и второй байты 16-битного регистра. Так, чтобы четко и последовательно, без сумрачных фантазий автора и гениальных самописных функций о которых известно только, что они где-то есть. Заранее извиняюсь, если прошу невозможное. Гугль и Яндекс добросовестно мучил 3 дня, ничего внятного не нашел в публикациях и в постах в рунете начиная с 2002 года... У буржуев что-то есть, но знание английского на уровне "сами мы не местные, дайте чёнибудь пожрать" не позволяет в полной мере оценить педагогические таланты западных программистов. |
![]() |
![]() |
![]() |
#4 | |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,893
Вес репутации: 5611/171 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#5 |
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Благодарю. Но, нет ли чего подобного на Си с русскими комментариями и пояснениями? Неужели за последние 15 лет никто не сотворил чего-то такого?
Нашел вот это:https://forum-chipmk.ru/index.php/to...dpost__p__7861 (под спойлером) и это: http://radiolaba.ru/microcotrollers/i2c-interfeys.html Но во втором случае опять же ассемблер, разбираясь в хитрых конструкциях которого я теряю нить рассуждений относительно самого I2C. И, в обоих примерах рассматривается прием одного байта, который у меня вроде и так получается принять. Проблемы со вторым байтом 16-разрядного регистра. Не пойму, каким образом осуществляется подтверждение приема первого байта чтобы корректно принять второй байт, с помощью каких битов из регистров управления I2C PIC16. Нужно ли делать повторный старт перед чтением второго байта? В даташите на PIC16F87x четко указано, что нужно (правда, не нашел в этом же даташите последовательность действий при чтении, только рисунок с графиками). А на рисунках по второй ссылке про RSEN ни слова. |
![]() |
![]() |
![]() |
#6 |
Junior Member
Регистрация: 22.01.2016
Сообщений: 25
Вес репутации: 165/16 ![]() ![]() |
![]()
Посмотрите, может поможет. pic16c773 и 24LC02
Извините, ошибся. Это один байт. |
![]() |
![]() |
![]() |
#7 |
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Ну ладно, четкого конкретного примера я скорее всего не найду. Нашел несколько тем на этом форуме с записью/чтением внешнего eeprom, но там люди чего-то на МикроСи корябали с использованием встроенных библиотек, так шта большая часть написанного там похожа на наскальные рисунки о назначении которых нужно еще суметь догадаться. У меня XC8, отчего приходится все руками делать.
Прошу пояснить хотя бы, что и как нужно подтверждать после приема каждого байта. То, что подтверждать последний принятый байт не нужно, это я уже знаю, просто выставляется условие STOP и все. Но что происходит между приемом отдельных байтов? При передаче проблем нет, просто проверяется бит ACKSTAT на равенство единице. Как только ACKSTAT = 1, значит байт принят ведомым. Можно отсылать следующий байт, убедившись в том, что процесс записи данных в буфер закончен (по флагу прерывания SSPIF). Но это при передаче, а в ходе приема нужно подтвердить прием байта, при том опять же проверить состояние бита ACKSTAT. Из рисунка в даташите на PIC16F87x видно, что кроме проверки ACKSTAT нужно сделать еще что-то с битами ACKEN и ACKDT. Но не пойму что с ними делать и в каком месте. |
![]() |
![]() |
![]() |
#8 |
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Посмотрел, спасибо. Хоть пример и с одним байтом, но из него видно, что нужно использовать RSEN для повторного старта. Именно RSEN, а не SEN, который видел в нескольких примерах найденных в интернете, там, где был повторный старт. Возможно у авторов оно даже работало, а я чесал репу не понимая чего же мне писать, RSEN или SEN.
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Asmodey
i2c подразумевает канальный уровень взаимодействия. иначе говоря когда что-то подключаете - там есть последовательность с которой устройство готово работать. иначе говоря написано что, как и когда генерировать, чтобы был нормальный обмен. |
![]() |
![]() |
![]() |
#10 | ||
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]() Цитата:
Цитата:
Плюс это: |
||
![]() |
![]() |
![]() |
#11 | |||
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Вот что я имею на сегодняшний день (и что имеет меня уже 3_й день подряд):
Цитата:
itwoc() - функция передачи данных в ведомого по I2C, и выглядит она так: Цитата:
Цитата:
Последний раз редактировалось Asmodey; 12.04.2018 в 12:11. |
|||
![]() |
![]() |
![]() |
#12 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Asmodey
чтение заканчивается с помощью nack. nack генерится с помощью ACKDT = 1, потом ACKEN. иначе у Вас будет блокировка шины. блокировка шины в тривиальных случаях снимается девятью клоками. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
для 32 пикушки для операционной системы пример чтения с установкой ack/nack.
Код:
/** * rx data from i2c bus, make ack/nack after * @param i2c - i2c instance * @param ack - ack/nack to gen after tx/rx * @return - recceived data */ static inline u8 i2cm_rx(i2ce_t* restrict i2c, b8 ack) { u8 result; /* set recceive */ int_flag_clr(i2c->irq_res); i2c->i2c->con.set.rcen = 1; if(i2c->baud_mult < (I2C_YIELD_THRESHOLD << 3)){ /* use spinlock */ while(i2c->i2c->con.rcen); }else{ /* use condint wait */ pthread_condint_wait(&i2c->cond, i2c->irq_res); } result = (u8)(i2c->i2c->rcv); /* make ack */ int_flag_clr(i2c->irq_res); i2c->i2c->con.set.ackdt = !(ack); i2c->i2c->con.set.acken = 1; if(i2c->baud_mult < I2C_YIELD_THRESHOLD){ /* use spinlock */ while(i2c->i2c->con.acken); }else{ /* use condint wait */ pthread_condint_wait(&i2c->cond, i2c->irq_res); } return result; } Код:
/* nine dummy clocks at low speed to unlock bus if it's locked */ for(uf temp = 9; temp; --temp){ i2c->clk_port->latclr = i2c->clk_mask; msleep(1); i2c->clk_port->latset = i2c->clk_mask; msleep(1); } |
![]() |
![]() |
![]() |
#14 | |
Junior Member
Регистрация: 22.01.2016
Сообщений: 25
Вес репутации: 165/16 ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Asmodey
к слову, у Вас в рисунке к чипу Вашему явно указано, что последним чтением нужно генерировать NACK. подчеркнутая A. посмотрите внимательней. |
![]() |
![]() |
![]() |
#16 | |
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Я решил было, что инверсная A просто отсутствие какого бы то ни было подтверждения или не подтверждения.
Цитата:
Последний раз редактировалось Asmodey; 12.04.2018 в 13:58. |
|
![]() |
![]() |
![]() |
#17 | ||
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Спасибо, друзья! Заработало чтение. Выкинул нафик ненужную проверку бита ACKSTAT и вставил после чтения первого байта ACKDT=0 и ACKEN=1, а после чтения последнего ACKDT=1 и ACKEN=1. Все заработало
![]() Правда, проверка сброса в 0 бита ACKEN почему-то не получилась, пришлось организовать проверку сброса ACKEN посредством флага SSPIF. Тогда все четко стало функциклировать. Вот код, может кому пригодится: Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#18 | |
Senior Member
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,183
Вес репутации: 1775/75 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
ЗАпускаете MCC, в окне Versions -> Libraryes ищите примеры с I2C (I2C EEPROM, MCP794xx I2C RTCC или подобное) -> двойной клик и появляется кнопка "Load Selected Library". Потом добавляете библиотеку в проект, добавляете модуль MSSP, задаете в Pin manager какие pin для SDA/SCL. Генерируете код. короч. MCC классная штука - рекомендую )) |
|
![]() |
![]() |
![]() |
#19 |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,893
Вес репутации: 5611/171 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
если честно, в вашем коде вообще все ненужное. особенно умиляют эти while (SSPIF == 0) (а если он вообще _никогда_ не встанет?)
все эти регистры имеют смысл только для слейва, на таком примитиве мастера пишут или ногодрыгом или если уж совсем прет через регистры, с ДМА. |
![]() |
![]() |
![]() |
#20 |
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
Блин, а я им только выводы у камней переназначал, и тихонечко матерился когда промахивался мышкой и не вовремя жал на значок MCC. Но в проекте с камнем 16F887 он не открывается, наверное потому, что периферия у 887 железно привязана к определенным выводам и не изменяется.
Ой, да полноте вам... Какие ваши годы? |
![]() |
![]() |
![]() |
#21 | ||
Senior Member
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,691
Вес репутации: 2423/83 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
![]() Но Greg асолютно прав: - если нужен только I2C-мастер, чтобы записать/прочитать еепромку или несколько регистров внешнего чипа, а не слейв или мулььтимастер, - если функции написаны как блокирующие (т.е. везде while(..) - если нет надобности работать с фаст и суперфаст I2C (400 и 1000 kHZ) то использование аппаратного I2C практически не дает преимуществ по размеру кода и зачастую и по скорости выполнения перед тривиальным ногодрыгом. При это I2C ногодрыгом имеет гораздо более простой и понятный код, и нет привязки к определенным ножкам проца, что такде може быть полезно (они могут быть заняты чем-тот другим, например скоростным SPI, или просто для более простой разводки платы). Главное помнить, что ногодрыд надо делать не установкой/сбросом битов порта, а битов TRIS, а в битах пора должен быть 0. |
||
![]() |
![]() |
![]() |
#22 |
Member
Регистрация: 21.11.2009
Сообщений: 35
Вес репутации: 138/38 ![]() ![]() |
![]()
DimaS, тут понимаете еще в чем дело... Есть железка, должна работать, но у меня не работает. Ну как я мог просто так взять и забить на нее?
|
![]() |
![]() |
![]() |
#23 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
DimaS
у ногодрыга единственное в общем случае может быть произвольное, большее время любого из периодов, в силу того что у ногодрыга в любой момент может быть переключение потока на другой. не сталкивался чтобы это было проблемой. |
![]() |
![]() |
![]() |
#24 |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,893
Вес репутации: 5611/171 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
Метки |
i2c, mssp |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
примеры кода для работы с USB | flashik | Вопросы начинающих | 5 | 08.05.2015 12:45 |
Где взять примеры работы с LCD в 16F19xx? | Вова | Продукция MICROCHIP | 4 | 22.02.2012 01:54 |
Может кто знает где можно посмотреть примеры для работы с wg12232 | alexdos | Общетехнические вопросы | 0 | 30.01.2012 01:19 |
А где бы взять список(и краткое описание) команд работы с SPI, I2C, USART и т.д. от Хайтека? | Zloj_ya | Продукция MICROCHIP | 3 | 18.08.2007 19:27 |
help! ищу c-examples работы USI в режиме i2c | Yuri | Продукция MICROCHIP | 2 | 18.05.2007 00:47 |