PIC I2C ведомый Ack на данных - PullRequest
2 голосов
/ 03 июня 2009

Я изучаю протокол I2C для PIC16F88X. То, что я хотел бы сделать, - это включить подчиненный I2C в ACK или NACK в зависимости от данных, полученных на I2C.

PIC может ACK или NACK для адреса I2C, отправляемого по линии, но из того, что я прочитал, всегда будет ACK для последующих полученных байтов. Это правильно?

В следующем сообщении:

Start - I2c_Addr+write/ACK - Register_value/Nack

Я бы хотел, чтобы подчиненный мог получать или подтверждать, в зависимости от значения в регистре _. Если ведомое устройство не понимает значение Register _, оно не должно подтверждаться.

Может ли кто-нибудь либо подтвердить, что это невозможно, либо подсказать, как это сделать?

Ответы [ 2 ]

8 голосов
/ 04 июня 2009

Если вы используете периферийное устройство MSSP

краткий ответ: То, о чем вы просите, возможно, невозможно с PIC, по крайней мере, без ударов по битам линий ввода / вывода. Причина в том, что подтверждение / подтверждение проверяется на 9-м тактовом фронте, а прерывание SSPIF не срабатывает до конца 9-го тактового сигнала. Вы можете попытаться повторно проверить бит BF, как он установлен, как только байт данных сдвинут в регистр ввода / вывода (8-й такт). Если вы можете выполнить сравнение и установить бит SSPOV до 9-го тактового цикла, это должно сгенерировать NACK, это довольно схематично, если у вас запущены какие-либо прерывания.

более длинный ответ: звучит так, будто вы пытаетесь проверить, является ли байт данных, который получает ведомый, действительным или не использует ack. лично я бы не стал этого делать, ack должен сигнализировать о целостности линии, а не проверять целостность данных. Если устройство является подчиненным, мастер по определению должен точно знать, как оно должно работать, и может проверить правильность байта, прежде чем выдвинуть его на линии I2C. В таких случаях я предполагаю, что у вас также есть контроль над основным кодом I2C, используйте один общий заголовочный файл, который определяет все команды или действительные байты данных, которые можно отправлять, чтобы избежать несоответствий в коде.

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

Если ваша цель - гарантировать целостность линии I2C, ни один из этих подходов действительно не работает. Единственным вариантом будет отправлять большую часть байтов при загрузке или периодически с CRC и проверять, совпадают ли они на ведомом устройстве. Обычно линии I2C либо работают, либо нет, они имеют низкую скорость, обычно имеют короткие трассы и имеют высокую допустимую емкость шины, если они не работают, вы вообще не увидите никаких подтверждений.

1 голос
/ 04 июня 2009

Полагаю, нет, если аппаратное обеспечение I2C встроено в PIC. Все аппаратные решения, с которыми я работал, имеют конечный автомат, который не может помочь, но подтверждает второй байт, если в передаче нет ошибок (например, не хватает). Вам лучше сделать свою собственную реализацию I2C в программном обеспечении с разбивкой по битам и буфером с открытым коллектором для ACK. Тогда вы можете делать все, что захотите. Это не будет стандартом I2C, поэтому будьте осторожны, если вы подключите к шине устройства, которые не соответствуют вашим требованиям. Я не уверен в этом, но думаю, что для любого стандартного устройства I2C, если оно не получает ACK, оно может повторно передать данные или просто сбой, поскольку не уверен, кто контролирует шину после сбоя (обозначается NAK ).

...