Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 06.11.2013, 21:27   #1
Vovka
Senior Member
 
Аватар для Vovka
 
Регистрация: 27.12.2007
Адрес: недалеко от г.Белгорода
Возраст: 50
Сообщений: 1,880
Вес репутации: 2862/85
Vovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond repute
Отправить сообщение для Vovka с помощью ICQ
Exclamation Примеры работы с I2C

Вот нашел интересную статью, может кому сгодиться:
Interfacing the Microchip PIC18F Microcontroller Master Synchronous Serial Port (MSSP) to various I2C Devices
Vovka вне форума   Ответить с цитированием
Старый 14.04.2015, 12:39   #2
Vint
Senior Member
 
Аватар для Vint
 
Регистрация: 08.06.2007
Сообщений: 491
Вес репутации: 838/53
Vint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to beholdVint is a splendid one to behold
По умолчанию Re: Примеры работы с I2C

А кто-нибудь использовал утилиту
"MCP2221 I2C SMBus Terminal" + mcp2221 чип
для отладки усторойства с I2C ?
Vint вне форума   Ответить с цитированием
Старый 12.04.2018, 09:21   #3
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Господа, ткните пожалуйста носом в примеры чтения по I2C двухбайтовых регистров из слейв устройств для PIC16. В какой-нибудь более или менее читаемый исходник: с полным кодом в одном файле (без отсылок к подключаемым файлам, которые порой отсутствуют в самих примерах), желательно с русскими комментами (не на корявом русском английском, которые сами авторы прочитать не в состоянии через неделю после написания).

Что-то такое, где наглядно (в столбик) было показано, что делать с битами регистров управления I2C PIC16 в ходе обращения МК к слейву. Как адресуется чип, как адресуется регистр, как читаются первый и второй байты 16-битного регистра. Так, чтобы четко и последовательно, без сумрачных фантазий автора и гениальных самописных функций о которых известно только, что они где-то есть.

Заранее извиняюсь, если прошу невозможное. Гугль и Яндекс добросовестно мучил 3 дня, ничего внятного не нашел в публикациях и в постах в рунете начиная с 2002 года... У буржуев что-то есть, но знание английского на уровне "сами мы не местные, дайте чёнибудь пожрать" не позволяет в полной мере оценить педагогические таланты западных программистов.
Asmodey вне форума   Ответить с цитированием
Старый 12.04.2018, 09:32   #4
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,739
Вес репутации: 5285/161
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от Asmodey Посмотреть сообщение
Господа, ткните пожалуйста носом в примеры чтения по I2C двухбайтовых регистров из слейв устройств для PIC16. В какой-нибудь более или менее читаемый исходник: с полным кодом в одном файле (без отсылок к подключаемым файлам, которые порой отсутствуют в самих примерах), желательно с русскими комментами (не на корявом русском английском, которые сами авторы прочитать не в состоянии через неделю после написания).

Что-то такое, где наглядно (в столбик) было показано, что делать с битами регистров управления I2C PIC16 в ходе обращения МК к слейву. Как адресуется чип, как адресуется регистр, как читаются первый и второй байты 16-битного регистра. Так, чтобы четко и последовательно, без сумрачных фантазий автора и гениальных самописных функций о которых известно только, что они где-то есть.
во вложении классическая аппнота.
Миниатюры
00567.PDF  
Greg вне форума   Ответить с цитированием
Старый 12.04.2018, 10:13   #5
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Благодарю. Но, нет ли чего подобного на Си с русскими комментариями и пояснениями? Неужели за последние 15 лет никто не сотворил чего-то такого?

Нашел вот это:https://forum-chipmk.ru/index.php/to...dpost__p__7861 (под спойлером)

и это: http://radiolaba.ru/microcotrollers/i2c-interfeys.html

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

И, в обоих примерах рассматривается прием одного байта, который у меня вроде и так получается принять. Проблемы со вторым байтом 16-разрядного регистра. Не пойму, каким образом осуществляется подтверждение приема первого байта чтобы корректно принять второй байт, с помощью каких битов из регистров управления I2C PIC16. Нужно ли делать повторный старт перед чтением второго байта? В даташите на PIC16F87x четко указано, что нужно (правда, не нашел в этом же даташите последовательность действий при чтении, только рисунок с графиками). А на рисунках по второй ссылке про RSEN ни слова.
Asmodey вне форума   Ответить с цитированием
Старый 12.04.2018, 10:35   #6
r_k_p
Junior Member
 
Регистрация: 22.01.2016
Сообщений: 21
Вес репутации: 165/11
r_k_p has a spectacular aura aboutr_k_p has a spectacular aura about
По умолчанию Re: Примеры работы с I2C

Посмотрите, может поможет. pic16c773 и 24LC02
Извините, ошибся. Это один байт.
Вложения
Тип файла: zip I2C.zip (1.7 Кб, 2 просмотров)
r_k_p вне форума   Ответить с цитированием
Старый 12.04.2018, 10:48   #7
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Ну ладно, четкого конкретного примера я скорее всего не найду. Нашел несколько тем на этом форуме с записью/чтением внешнего eeprom, но там люди чего-то на МикроСи корябали с использованием встроенных библиотек, так шта большая часть написанного там похожа на наскальные рисунки о назначении которых нужно еще суметь догадаться. У меня XC8, отчего приходится все руками делать.

Прошу пояснить хотя бы, что и как нужно подтверждать после приема каждого байта. То, что подтверждать последний принятый байт не нужно, это я уже знаю, просто выставляется условие STOP и все. Но что происходит между приемом отдельных байтов?

При передаче проблем нет, просто проверяется бит ACKSTAT на равенство единице. Как только ACKSTAT = 1, значит байт принят ведомым. Можно отсылать следующий байт, убедившись в том, что процесс записи данных в буфер закончен (по флагу прерывания SSPIF). Но это при передаче, а в ходе приема нужно подтвердить прием байта, при том опять же проверить состояние бита ACKSTAT.

Из рисунка в даташите на PIC16F87x видно, что кроме проверки ACKSTAT нужно сделать еще что-то с битами ACKEN и ACKDT. Но не пойму что с ними делать и в каком месте.
Миниатюры
I2C прием.JPG  
Asmodey вне форума   Ответить с цитированием
Старый 12.04.2018, 10:53   #8
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от r_k_p Посмотреть сообщение
Посмотрите, может поможет. pic16c773 и 24LC02
Извините, ошибся. Это один байт.
Посмотрел, спасибо. Хоть пример и с одним байтом, но из него видно, что нужно использовать RSEN для повторного старта. Именно RSEN, а не SEN, который видел в нескольких примерах найденных в интернете, там, где был повторный старт. Возможно у авторов оно даже работало, а я чесал репу не понимая чего же мне писать, RSEN или SEN.
Asmodey вне форума   Ответить с цитированием
Старый 12.04.2018, 11:16   #9
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

Asmodey
i2c подразумевает канальный уровень взаимодействия.
иначе говоря когда что-то подключаете - там есть последовательность с которой устройство готово работать.

иначе говоря написано что, как и когда генерировать, чтобы был нормальный обмен.
besogon вне форума   Ответить с цитированием
Старый 12.04.2018, 11:34   #10
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от besogon Посмотреть сообщение
иначе говоря когда что-то подключаете - там есть последовательность с которой устройство готово работать.
Подключаю я китайский чип, и там из описания вот это:

Цитата:
3.9. I2C Control Interface
Последовательный интерфейс (режим I2C) используется для чтения и записи регистров устройства, внешний контроллер может напрямую считывать и записывать регистр, не переходя ни в какие другие регистры. Существует также внутренний счетчик адресов, который автоматически перемещает указатель вперед после операции чтения / записи, так что внешний контроллер может непрерывно считывать / записывать необходимое количество регистров чипов, начиная с любого адреса. Сначала передается старший значащий бит регистра (MSB).

Режим шины I2C использует SCL и SDA для передачи данных. Устройство всегда управляет данными в SDA на заднем фронте SCL и захватывает данные из SDA по переднему фронту SCL. Устройство подтверждает внешний контроллер, вызывая низкий уровень SDA на заднем фронте SCL. Передача данных всегда начинается с состояния START и заканчивается условием STOP. Внешний контроллер может считывать / записывать 16-разрядные данные по указанному адресу или непрерывно считывать / записывать необходимое количество регистров данных с указанного адреса до тех пор, пока не произойдет условие STOP.

Для операций записи внешний контроллер должен отправить команду и данные в следующей последовательности: состояние START -> 7-битный адрес чипа и команда Write («0») -> 8-битный регистр адрес n -> запись данных n [15: 8] - > записать данные n [7: 0] -> записать данные n + 1 [15: 8] -> записать данные n + 1 [7: 0] -> ...... -> STOP.

Для операций чтения внешний контроллер должен отправить команду и данные в следующей последовательности: состояние START -> 7-битный адрес чипа и команда Write («0») -> адрес 8-битного регистра n-> 7-битовый адрес чипа и команда чтения (" 1 "), тогда устройство отправит данные считывания n [15: 8] -> прочитанные данные n [7: 0] -> прочитанные данные n + 1 [15: 8] -> прочитанные данные n + 1 [7: 0] -> ...... до STOP состояние.
Но про биты ACKEN и ACKDT там ничего не сказано...

Плюс это:
Миниатюры
protocol.JPG  
Asmodey вне форума   Ответить с цитированием
Старый 12.04.2018, 11:58   #11
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Вот что я имею на сегодняшний день (и что имеет меня уже 3_й день подряд):

Цитата:
//---Старт----------------------------------------------------------------------

SEN=1; // Формирование условия START на линиях SCL, SDA

while(SSPIF==0){ // Ожидание формирования условия START. Если флаг SSPIF равен нулю, тогда продолжать ждать
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по выполнению условия START

//---Передача общего адреса с битом Write и адреса регистра в ведомый-----------

treg=0b01101010; //Запись в ведомого общего адреса с битом записи
itwoc(); // Функция записи байта в ведомого

treg=0b00010011; // Запись в ведомого адреса регистра 0x13 (19.)
itwoc(); // Функция записи байта в ведомого

//---Передача общего адреса с битом Read в ведомый----------------------------

RSEN=1; // Повторный старт

while(SSPIF==0){ // Ожидание формирования условия START. Если флаг SSPIF равен нулю, тогда продолжать ждать
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по выполнению условия START (RSEN)

treg=0b01101011; //Запись в ведомого общего адреса и бита чтения
itwoc(); // Функция записи байта в ведомого

//---Чтение первого байта из ведомого-------------------------------------------

RCEN=1; // Разрешить прием данных (включить приемник)

while(SSPIF==0){ // Ждем завершения чтения первого байта из ведомого в буферный регистр SSPBUF
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по заполнению буфера

rssi=SSPBUF; // Переписать в переменную rssi содержимое буферного регистра SSPBUF (первый принятый байт)

//---Подтверждение(чего-то от кого-то, пока хрен знает зачем)-------------------

while(ACKSTAT==1){ // Шут его знает зачем оно тут, но вроде как нужно
}
ACKSTAT=1; // См. коммент выше

//---Чтение второго байта-------------------------------------------------------

RCEN=1; // Разрешить прием данных (включить приемник)

while(SSPIF==0){ // Ждем завершения чтения второго байта из ведомого в буферный регистр SSPBUF
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по заполнению буфера

rssi=SSPBUF; // Переписать в переменную rssi содержимое буферного регистра SSPBUF (второй принятый байт)


//---Стоп-----------------------------------------------------------------------

PEN=1; // Формирование условия STOP на линиях SCL, SDA

while(SSPIF==0){ // Ожидание формирования условия STOP. Если флаг SSPIF не равен нулю, тогда продолжать ждать
}
SSPIF=0; // Обнуление флага SSPIF после поднятия его по выполнению условия STOP
Переменная rssi для записи в нее данных принятых из ведомого. treg - переменная, посредством которой данные которые необходимо записать в ведомого передаются функции передачи по I2C.

itwoc() - функция передачи данных в ведомого по I2C, и выглядит она так:

Цитата:
void itwoc(){
SSPBUF=treg; // Пишем в буферный регистр SSPBUF содержимое переменной treg

while(SSPIF==0){ // Ждем опустошения буфера
}
SSPIF=0; // Сбрасываем флаг SSPIF поднятый по окончанию записи байта в ведомый

while(ACKSTAT==1){ // Ждем от ведомого подтверждения записи байта
}
ACKSTAT=1; // Устанавливаем в 1 бит ACKSTAT, сброшенный в 0 для подтверждение приема от ведомого
}
Я прекрасно понимаю, что проблема кроется в этом куске:

Цитата:
//---Подтверждение(чего-то от кого-то, пока хрен знает зачем)-------------------

while(ACKSTAT==1){ // Шут его знает зачем оно тут, но вроде как нужно
}
ACKSTAT=1; // См. коммент выше
Не хватает каких-то действий с битами ACKEN и ACKDT. Но каких? Тут я себе уже все мозги поломал, просто смотрю в даташиты и апноуты, и ничегошеньки не вижу... Голова устала.

Последний раз редактировалось Asmodey; 12.04.2018 в 12:11.
Asmodey вне форума   Ответить с цитированием
Старый 12.04.2018, 12:54   #12
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

Asmodey
чтение заканчивается с помощью nack.
nack генерится с помощью ACKDT = 1, потом ACKEN.
иначе у Вас будет блокировка шины.

блокировка шины в тривиальных случаях снимается девятью клоками.
besogon вне форума   Ответить с цитированием
Старый 12.04.2018, 12:56   #13
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

для 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;
}
раз уж речь пошла, то в init обязательно 9 клоков для того, чтобы если шина залочена - разлочить.
Код:
	/* 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);		
	}
besogon вне форума   Ответить с цитированием
Старый 12.04.2018, 13:02   #14
r_k_p
Junior Member
 
Регистрация: 22.01.2016
Сообщений: 21
Вес репутации: 165/11
r_k_p has a spectacular aura aboutr_k_p has a spectacular aura about
По умолчанию Re: Примеры работы с I2C

Цитата:
Я прекрасно понимаю, что проблема кроется в этом куске:

Не хватает каких-то действий с битами ACKEN и ACKDT. Но каких? Тут я себе уже все мозги поломал, просто смотрю в даташиты и апноуты, и ничегошеньки не вижу... Голова устала.
ACKEN используется только при приеме байта и подтверждает прием битом, установленным в ACKDT. 0 - подтверждение, 1 - нет подтверждения. Последний принятый байт не подтверждается низким уровнем на SDA, сообщая что байт последний. Также на русском можно посмотреть: http://embedded.ifmo.ru/sdk/sdk20/la...K_2_0_lab9.pdf
r_k_p вне форума   Ответить с цитированием
Старый 12.04.2018, 13:24   #15
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

Asmodey
к слову, у Вас в рисунке к чипу Вашему явно указано, что последним чтением нужно генерировать NACK. подчеркнутая A.
посмотрите внимательней.
besogon вне форума   Ответить с цитированием
Старый 12.04.2018, 13:39   #16
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Я решил было, что инверсная A просто отсутствие какого бы то ни было подтверждения или не подтверждения.

Цитата:
Сообщение от r_k_p Посмотреть сообщение
ACKEN используется только при приеме байта и подтверждает прием битом, установленным в ACKDT. 0 - подтверждение, 1 - нет подтверждения. Последний принятый байт не подтверждается низким уровнем на SDA, сообщая что байт последний. Также на русском можно посмотреть: http://embedded.ifmo.ru/sdk/sdk20/la...K_2_0_lab9.pdf
Благодарю. Я из этого документа только одну страничку №6 находил в интернете.

Последний раз редактировалось Asmodey; 12.04.2018 в 13:58.
Asmodey вне форума   Ответить с цитированием
Старый 12.04.2018, 22:15   #17
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Спасибо, друзья! Заработало чтение. Выкинул нафик ненужную проверку бита ACKSTAT и вставил после чтения первого байта ACKDT=0 и ACKEN=1, а после чтения последнего ACKDT=1 и ACKEN=1. Все заработало

Правда, проверка сброса в 0 бита ACKEN почему-то не получилась, пришлось организовать проверку сброса ACKEN посредством флага SSPIF. Тогда все четко стало функциклировать.

Вот код, может кому пригодится:

Цитата:
//---Старт----------------------------------------------------------------------

SEN=1; // Формирование условия START на линиях SCL, SDA

while(SSPIF==0){ // Ожидание формирования условия START. Если флаг SSPIF равен нулю, тогда продолжать ждать
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по выполнению условия START

//---Передача общего адреса с битом Write и адреса регистра в ведомый-----------

treg=0b01101010; //Запись в ведомого общего адреса с битом записи
itwoc(); // Функция записи байта в ведомого

treg=0b00010010; // Запись в ведомого адреса регистра 0x12 (либо другого необходимого)
itwoc(); // Функция записи байта в ведомого

//---Передача общего адреса с битом Read в ведомый----------------------------

RSEN=1; // Повторный старт

while(SSPIF==0){ // Ожидание формирования условия START. Если флаг SSPIF равен нулю, тогда продолжать ждать
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по выполнению условия START (RSEN)

treg=0b01101011; //Запись в ведомого общего адреса и бита чтения
itwoc(); // Функция записи байта в ведомого

//---Чтение первого байта из ведомого-------------------------------------------

RCEN=1; // Разрешить прием данных (включить приемник)

while(SSPIF==0){ // Ждем завершения чтения первого байта из ведомого в буферный регистр SSPBUF
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по заполнению буфера

rssih=SSPBUF; // Переписать в переменную rssi содержимое буферного регистра SSPBUF (первый принятый байт)

ACKDT=0; // Сбросить бит ACKDT
ACKEN=1; // Инициировать подтверждение

while(SSPIF==0){ // Ждем завершения подтверждения
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по заполнению буфера

//---Чтение второго байта-------------------------------------------------------

RCEN=1; // Разрешить прием данных (включить приемник)

while(SSPIF==0){ // Ждем завершения чтения второго байта из ведомого в буферный регистр SSPBUF
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по заполнению буфера

rssil=SSPBUF; // Переписать в переменную rssi содержимое буферного регистра SSPBUF (второй принятый байт)

ACKDT=1; // Установить бит ACKDT
ACKEN=1; // Инициировать подтверждение

while(SSPIF==0){ // Ждем завершения подтверждения
}
SSPIF=0; // Сброс флага SSPIF после поднятия его по заполнению буфера

//---Стоп-----------------------------------------------------------------------

PEN=1; // Формирование условия STOP на линиях SCL, SDA

while(SSPIF==0){ // Ожидание формирования условия STOP. Если флаг SSPIF не равен нулю, тогда продолжать ждать
}
SSPIF=0; // Обнуление флага SSPIF после поднятия его по выполнению условия STOP
В переменную rssih пишется содержимое первого прочитанного байта, в rssil содержимое второго байта. itwoc(), это функция записи в регистры ведомого. Ее код:

Цитата:
void itwoc(){
SSPBUF=treg; // Пишем в буферный регистр SSPBUF содержимое переменной treg

while(SSPIF==0){ // Ждем опустошения буфера
}
SSPIF=0; // Сбрасываем флаг SSPIF поднятый по окончанию записи байта в ведомый

while(ACKSTAT==1){ // Ждем от ведомого подтверждения записи байта
}
ACKSTAT=1; // Устанавливаем в 1 бит ACKSTAT, сброшенный в 0 для подтверждение приема от ведомого
}
P.S. три дня, пилять...
Asmodey вне форума   Ответить с цитированием
Старый 13.04.2018, 17:47   #18
Илья
Senior Member
 
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,152
Вес репутации: 1775/70
Илья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant future
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от Asmodey Посмотреть сообщение
Господа, ткните пожалуйста носом в примеры чтения по I2C двухбайтовых регистров из слейв устройств для PIC16.
...
Гугль и Яндекс добросовестно мучил 3 дня, ничего внятного не нашел в публикациях
берете MPLAB X, устанавливаете плагин MCC.
ЗАпускаете MCC,
в окне Versions -> Libraryes ищите примеры с I2C (I2C EEPROM, MCP794xx I2C RTCC или подобное) -> двойной клик и появляется кнопка "Load Selected Library".
Потом добавляете библиотеку в проект, добавляете модуль MSSP, задаете в Pin manager какие pin для SDA/SCL. Генерируете код.

короч. MCC классная штука - рекомендую ))
Илья вне форума   Ответить с цитированием
Старый 13.04.2018, 19:51   #19
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,739
Вес репутации: 5285/161
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от Asmodey Посмотреть сообщение
Выкинул нафик ненужную проверку бита
Вот код, может кому пригодится:
если честно, в вашем коде вообще все ненужное. особенно умиляют эти while (SSPIF == 0) (а если он вообще _никогда_ не встанет?)
все эти регистры имеют смысл только для слейва, на таком примитиве мастера пишут или ногодрыгом или если уж совсем прет через регистры, с ДМА.
Greg вне форума   Ответить с цитированием
Старый 14.04.2018, 09:06   #20
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от Илья Посмотреть сообщение
MCC классная штука - рекомендую ))
Блин, а я им только выводы у камней переназначал, и тихонечко матерился когда промахивался мышкой и не вовремя жал на значок MCC. Но в проекте с камнем 16F887 он не открывается, наверное потому, что периферия у 887 железно привязана к определенным выводам и не изменяется.
Цитата:
Сообщение от Greg Посмотреть сообщение
а если он вообще _никогда_ не встанет?
Ой, да полноте вам... Какие ваши годы?
Asmodey вне форума   Ответить с цитированием
Старый 14.04.2018, 10:42   #21
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 45
Сообщений: 1,492
Вес репутации: 2283/74
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от Asmodey Посмотреть сообщение
Цитата:
Сообщение от Greg
а если он вообще _никогда_ не встанет?
Ой, да полноте вам... Какие ваши годы?
Оно конечно смешно
Но Greg асолютно прав:
- если нужен только I2C-мастер, чтобы записать/прочитать еепромку или несколько регистров внешнего чипа, а не слейв или мулььтимастер,
- если функции написаны как блокирующие (т.е. везде while(..)
- если нет надобности работать с фаст и суперфаст I2C (400 и 1000 kHZ)

то использование аппаратного I2C практически не дает преимуществ по размеру кода и зачастую и по скорости выполнения перед тривиальным ногодрыгом.
При это I2C ногодрыгом имеет гораздо более простой и понятный код, и нет привязки к определенным ножкам проца, что такде може быть полезно (они могут быть заняты чем-тот другим, например скоростным SPI, или просто для более простой разводки платы).

Главное помнить, что ногодрыд надо делать не установкой/сбросом битов порта, а битов TRIS, а в битах пора должен быть 0.
DimaS вне форума   Ответить с цитированием
Старый 14.04.2018, 13:41   #22
Asmodey
Junior Member
 
Регистрация: 21.11.2009
Сообщений: 29
Вес репутации: 138/33
Asmodey will become famous soon enoughAsmodey will become famous soon enough
По умолчанию Re: Примеры работы с I2C

DimaS, тут понимаете еще в чем дело... Есть железка, должна работать, но у меня не работает. Ну как я мог просто так взять и забить на нее?
Asmodey вне форума   Ответить с цитированием
Старый 14.04.2018, 22:52   #23
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

DimaS
у ногодрыга единственное в общем случае может быть произвольное, большее время любого из периодов, в силу того что у ногодрыга в любой момент может быть переключение потока на другой.

не сталкивался чтобы это было проблемой.
besogon вне форума   Ответить с цитированием
Старый 15.04.2018, 09:27   #24
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,739
Вес репутации: 5285/161
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Примеры работы с I2C

Цитата:
Сообщение от besogon Посмотреть сообщение
не сталкивался чтобы это было проблемой.
аналогично
Greg вне форума   Ответить с цитированием
Ответ

Метки
i2c, mssp


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
примеры кода для работы с 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


Часовой пояс GMT +3, время: 18:36.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot