Если предположить, что с помощью MSSP периферийное
короткий ответ: Что ваш просят не вероятно, возможно с ПОС, по крайней мере, без разрядных ударив линий ввода/вывода. Причина в том, что ack/nack проверяется на 9-м фронте тактового сигнала, а прерывание SSPIF не запускается до конца девятого такта. Вы можете попытаться повторно проверить бит BF, как только он будет установлен, как только байт данных будет сдвинут в регистр ввода-вывода (8-й такт). Если вы можете выполнить сравнение и установить бит SSPOV до 9-го такта, это должно сгенерировать NACK, это довольно отрывочно, если у вас есть какие-либо прерывания.
более длинный ответ: похоже, что вы пытаетесь проверить, действителен ли байт данных, который получает подчиненный, или нет с помощью ack. лично я бы этого не сделал, ack должен сигнализировать целостность строки, а не проверять целостность данных. Если устройство является подчиненным устройством, мастер по определению должен точно знать, как он должен работать и может проверить правильность байта, прежде чем выталкивать его на линии I2C. В таких случаях я предполагаю, что вы также имеете контроль над кодом хозяина I2C, используйте один общий файл заголовка, который определяет все команды или допустимые байты данных, которые можно отправить, чтобы избежать несоответствий в коде.
Если вы должны гарантировать, что по какой-либо причине был отправлен правильный байт, попросите ведущего запросить подчиненный ответный байт, чтобы подчиненный вернул код, указывающий результат предыдущей передачи.
Если вы намерены гарантировать целостность линии I2C, ни один из этих подходов не работает. Единственный вариант - отправить большую часть байтов при загрузке или периодически с помощью CRC и проверить, совпадает ли он с ведомым. Обычно линии I2C будут работать или нет, они имеют низкую скорость, обычно имеют короткие трассы и имеют высокую допустимую емкость шины, если они не работают, вы вообще не увидите никаких акков.
Быстрый вопрос о разъяснении: будет ли ваш PIC быть главным или подчиненным (или и тем и другим) в этой транзакции I2C? – Nate
Два ПОС, один раб и один мастер. Кажется, что проблема находится в подчиненном (решая NAck неактуальный регистр). Возможно, вы думаете о нескольких мастерах? Если вы и у вас есть информация, чтобы дать, не стесняйтесь ответить ... – Gauthier