Процедура чтения регистра: сначала нужно записать адрес регистра, а за тем прочитать N байт. Пример чтение из регистра 0x20 3 байта на устройстве 0x10 – S 10 20 S 11 03 P
Ясно, я могу полностью отвечать только за инструкцию к нашим модулям, там могу всё сделать красиво
Писать общую инструкцию к ORFA без конкретного модуля не решаюсь потому что новички умрут, а надо рассчитывать на них. Сейчас переделаем протоколы - может быть тогда можно будет что-то типа общей инструкции сделать, но всё равно конкретные инструкции будут понятней для использования с нашими модулями, потому что не надо будет лезть куда-то и смотреть - а есть эта шняга в этом модуле или нет.
Понятно. Я то полез в общую, потому что пытался вообще понять, используется ли для I2C какой-то "специфический" протокол, или можно как попало разговаривать, не вмешиваясь в фирмварь.
Вообще орфе пофиг, делайте обычную поддержку i2c-протокола, только очень длинные запросы не делайте и всё.
Т.е. ORFA может делать сколь угодно длинные запросы с множественными рестартами и переключением между read\write режимами. Всё ограничено только буфером команды внутри ORFA, сейчас он вроде 65 символов, можно увеличить.
Добавлено спустя 2 часа 53 минуты 32 секунды: Какие команды сделать для GPIO и АЦП?
Вот накидал эскиз:
АЦП: AS=(Int|AVCC|Ext) - определить источник опорного напряжения AP=(8|10) - выбрать нужную точность 8 или 10 бит AM=(0|1)*8 - определить какие каналы АЦП включены (7..0) AR(0..7) - прочитать значение канала АЦП 0..7 если он включен
GPIO: GD(A..F)=(0|1)*8 - побитовая маска направления ввода-вывода порта A..F GO(A..F)=(0|1)*8 - байт который надо вывести в порт A..F GI(A..F) - прочитать байт из порта A..F
BD(A..F)(0..7)=(In|Out) - установить режим линии порта BO(A..F)(0..7)=(0|1) - вывести бит в порт BI(A..F)(0..7) - прочитать бит из порта
AS=AVCC //опорное - AVCC AP=8 //8 бит AM=00000001 //включить АЦП на 0 линии AR0 //прочитать 0 линию АЦП
BDA0=Out //выставить линию PORTA.0 как выход BOA0=1 //выставить линию PORTA.0 которая выход в высокий уровень (1)
BDA1=In //выставить линию PORTA.1 как вход BOA1=1 //выставить линию PORTA.1 которая вход в режим включения (1) подтягивающего резистора BIA1 //прочитать линию PORTA.1
Ладно, вариант 2, он же сокращенный через @ и еще через @ что происходит:
PinModeA0=In @ PMA0I @ выставляем порт A линию 0 в режим цифрового входа PinModeA0=Out @ PMA0O @ выставляем порт A линию 0 в режим цифрового выхода PinModeF0=ADC @ PMF0A @ выставляем порт F линию 0 в режим АЦП PinGetA0 @ PGA0 @ читаем значение на линии 0 порта A PinSetA0=1 @ PSA01 @ пишем значение в линию 0 порта A (если она настроена как вход - 1 включает подтяжку) PinAdcRef=(Int|Ext|AVCC) @ PR(I|E|A) @ выставить источник опорного напряжения для АЦП - внутренний, питание, внешний PinAdcBits=(8|10) @ PB(8|A) @ выбрать режим работы АЦП - 8 или 10 бит
Вот так тогда еще более улучшено и с группен-командами для дальнейшей реализации:
PinModeA0=In @ PMA0I @ выставляем порт A линию 0 в режим цифрового входа PinModeA0=Out @ PMA0O @ выставляем порт A линию 0 в режим цифрового выхода PinModeF0=ADC @ PMF0A @ выставляем порт F линию 0 в режим АЦП PinGetA0 @ PGA0 @ читаем значение на линии 0 порта A PinSetA0=1 @ PSA01 @ пишем значение в линию 0 порта A (если она настроена как вход - 1 включает подтяжку)
AdcRef=(Int|Ext|AVCC) @ AR(I|E|A) @ выставить источник опорного напряжения для АЦП - внутренний, питание, внешний AdcBits=(8|10) @ AB(8|A) @ выбрать режим работы АЦП - 8 или 10 бит
PortModeF=I*O*AIOA @ OMF=I*O*AIOA @ выставляем режим работы порта F - биты 2,7 вход, биты 1,5 выход, биты 0,3 вход ацп, биты 4,6 без изменения PortSetF=0011**01 @ OSF=0011**01 @ выставить у порта F линии 0,4,5 в высокий уровень, линии 1, 6 и 7 в низкий уровень, линии 2 и 3 оставить без изменения PortGetF @ OGF @ получить побитовые значения со входа порта F