This documentation is out of date.
The new version of the documentation is here: https://cannylogic.com/docs |
Difference between revisions of "CANNY 7, I²C Driver"
[unchecked revision] | [unchecked revision] |
(→Общее описание) |
(→Регистры драйвера I²C) |
||
Line 5: | Line 5: | ||
I²C driver operates using the controller channel resources, but has a higher priority than a discrete input-output driver. Thus, upon activation I²C driver, for channels involved in to its operation, changing values in registers associated with digital input-output driver will be ignored by the controller. | I²C driver operates using the controller channel resources, but has a higher priority than a discrete input-output driver. Thus, upon activation I²C driver, for channels involved in to its operation, changing values in registers associated with digital input-output driver will be ignored by the controller. | ||
− | === | + | === I²C Driver Registers === |
− | + | The following are descriptions of valid register values for I²C driver control operation. | |
− | + | I²C Driver Configuration Registers. | |
{|border="1" style="border-collapse:collapse;" align="left" width="100%" | {|border="1" style="border-collapse:collapse;" align="left" width="100%" | ||
|- align="center" valign="top" | |- align="center" valign="top" | ||
− | !width="250px"| | + | !width="250px"|Address |
− | ! | + | !Expected Values |
|- valign="top" | |- valign="top" | ||
| | | | ||
{|border="0" align="left" | {|border="0" align="left" | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Address Setup register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 25: | Line 25: | ||
|width="70px" style="padding-left:0.5em;"|2...254 | |width="70px" style="padding-left:0.5em;"|2...254 | ||
|style="padding-left:0.5em;"|= | |style="padding-left:0.5em;"|= | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|even number, slave-node address , which will have data exchange on the I²C bus. |
|} | |} | ||
|- valign="top" | |- valign="top" | ||
Line 31: | Line 31: | ||
{|border="0" align="left" | {|border="0" align="left" | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Enable Register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 38: | Line 38: | ||
|width="70px" style="padding-left:0.5em;"|1...65535 | |width="70px" style="padding-left:0.5em;"|1...65535 | ||
|style="padding-left:0.5em;"|= | |style="padding-left:0.5em;"|= | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|activate I²C driver , give it control of the controller channels, used as the SDA and SCL lines; |
|- valign="top" | |- valign="top" | ||
|width="70px" style="padding-left:0.5em;"|0 | |width="70px" style="padding-left:0.5em;"|0 | ||
|style="padding-left:0.5em;"|= | |style="padding-left:0.5em;"|= | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|deactivate I²C driver, return control of the channels to IO driver and allow to change their states from the functional diagram. |
|} | |} | ||
|- valign="top" | |- valign="top" | ||
| | | | ||
{|border="0" align="left" | {|border="0" align="left" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C SDA IO Channel Select Register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 54: | Line 54: | ||
|width="70px" style="padding-left:0.5em;"|0...10 | |width="70px" style="padding-left:0.5em;"|0...10 | ||
|style="padding-left:0.5em;"|= | |style="padding-left:0.5em;"|= | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|set controller channel number to use as I²C driver data transmission line. |
|} | |} | ||
|- valign="top" | |- valign="top" | ||
| | | | ||
{|border="0" align="left" | {|border="0" align="left" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C SCL IO Channel Select Register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 66: | Line 66: | ||
|width="70px" style="padding-left:0.5em;"|0...10 | |width="70px" style="padding-left:0.5em;"|0...10 | ||
|style="padding-left:0.5em;"|= | |style="padding-left:0.5em;"|= | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|set controller channel number to be used as I²C driver timing pulse transmission line. |
|} | |} | ||
|} | |} | ||
{| | {| | ||
− | |valign="top" style="padding-left:0.5em;"|'' | + | |valign="top" style="padding-left:0.5em;"|''Note:'' |
− | |valign="top" style="padding-left:0.5em;"|'' | + | |valign="top" style="padding-left:0.5em;"|''For SDA and SCL lines, individual controller channels must be assigned.'' |
|} | |} | ||
− | + | I²C driver diagnostic registers. | |
{|border="1" style="border-collapse:collapse;" align="left" width="100%" | {|border="1" style="border-collapse:collapse;" align="left" width="100%" | ||
|- align="center" valign="top" | |- align="center" valign="top" | ||
− | !width="250px"| | + | !width="250px"|Address |
− | ! | + | !Return values |
|- valign="top" | |- valign="top" | ||
| | | | ||
{|border="0" align="left" | {|border="0" align="left" | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Error register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 91: | Line 91: | ||
|width="70px" style="padding-left:0.5em;"|1 | |width="70px" style="padding-left:0.5em;"|1 | ||
|style="padding-left:0.5em;"|= | |style="padding-left:0.5em;"|= | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|an error occurred while sending or receiving I²C messages; |
|- valign="top" | |- valign="top" | ||
|width="70px" style="padding-left:0.5em;"|0 | |width="70px" style="padding-left:0.5em;"|0 | ||
|style="padding-left:0.5em;"|= | |style="padding-left:0.5em;"|= | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|the driver is operating normally. |
|} | |} | ||
|} | |} | ||
− | + | I²C Receive Registers. | |
{|border="1" style="border-collapse:collapse;" align="left" width="100%" | {|border="1" style="border-collapse:collapse;" align="left" width="100%" | ||
|- align="center" valign="top" | |- align="center" valign="top" | ||
− | !width="250px"| | + | !width="250px"|Address |
− | ! | + | !Return values |
|- valign="top" | |- valign="top" | ||
| | | | ||
{|border="0" align="left" | {|border="0" align="left" | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Data Set Ready Register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 125: | Line 125: | ||
{|border="0" align="left" | {|border="0" align="left" | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Received Length Register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 137: | Line 137: | ||
| | | | ||
{|border="0" align="left" | {|border="0" align="left" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Received Data Register D1:D0 |
|- valign="top" | |- valign="top" | ||
|style="padding-left:0.5em;"|... | |style="padding-left:0.5em;"|... | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Received Data Register D15:D14 |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 152: | Line 152: | ||
|} | |} | ||
− | + | I²C Transmit Registers. | |
{|border="1" style="border-collapse:collapse;" align="left" width="100%" | {|border="1" style="border-collapse:collapse;" align="left" width="100%" | ||
|- align="center" valign="top" | |- align="center" valign="top" | ||
Line 161: | Line 161: | ||
{|border="0" align="left" | {|border="0" align="left" | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Request To Send Register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 178: | Line 178: | ||
{|border="0" align="left" | {|border="0" align="left" | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Transmit Data Length Register |
|} | |} | ||
|valign="top"| | |valign="top"| | ||
Line 190: | Line 190: | ||
| | | | ||
{|border="0" align="left" | {|border="0" align="left" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Transmit Data Register D1:D0 |
|- valign="top" | |- valign="top" | ||
|style="padding-left:0.5em;"|... | |style="padding-left:0.5em;"|... | ||
|- valign="top" | |- valign="top" | ||
− | |style="padding-left:0.5em;"| | + | |style="padding-left:0.5em;"|I²C Transmit Data Register D15:D14 |
|} | |} | ||
|valign="top"| | |valign="top"| |
Revision as of 03:01, 18 March 2016
Contents
General Description
As communication lines (SDA and SCL) can be assigned to any pair of controller channels. In this case, the data channels must be pulled up to 5V with resistor of 1 k to 10 k outside of he controller. Particularity of I²C protocol implementation in CANNY7 controller is that CANNY7 can only act as a Master node. Data exchange between devices, which can be either mono- or bidirectional, occurs in separate sessions, the maximum message length I²C within one session is 16 bytes, ie opening of multiple sessions with different devices is not allowed. The rate of exchange is fixed at 100 kbit/s. The total number of slaves on the line can reach several tens.
I²C driver operates using the controller channel resources, but has a higher priority than a discrete input-output driver. Thus, upon activation I²C driver, for channels involved in to its operation, changing values in registers associated with digital input-output driver will be ignored by the controller.
I²C Driver Registers
The following are descriptions of valid register values for I²C driver control operation.
I²C Driver Configuration Registers.
Address | Expected Values | |||||||
---|---|---|---|---|---|---|---|---|
|
| |||||||
|
| |||||||
|
| |||||||
|
|
Note: | For SDA and SCL lines, individual controller channels must be assigned. |
I²C driver diagnostic registers.
Address | Return values | |||||||
---|---|---|---|---|---|---|---|---|
|
|
I²C Receive Registers.
Address | Return values | |||||||
---|---|---|---|---|---|---|---|---|
|
| |||||||
|
| |||||||
|
|
I²C Transmit Registers.
Адрес | Ожидаемые значения | |||||||
---|---|---|---|---|---|---|---|---|
|
| |||||||
|
| |||||||
|
|
Особенности работы драйвера I²C
Обмен данными в сети I²C с использованием контроллера CANNY7 определяется комбинацией значений регистров длинны передаваемого и принимаемого сообщения, установленных пользователем (смотри таблицу).
Значение регистра длины передаваемого сообщения I²C | Значение регистра длины принимаемого сообщения I²C | Направление обмена данными |
---|---|---|
> 0 | = 0 | Только передача данных от CANNY7 (Master) ведомому (Slave) устройству с адресом, указанным в соответствующем регистре. |
> 0 | > 0 | Передача данных от CANNY7 (Master) ведомому (Slave) устройству с адресом, указанным в соответствующем регистре, и получение от него ответных данных. |
= 0 | > 0 | Только прием данных CANNY7 (Master) от ведомого (Slave) устройства с адресом, указанным в соответствующем регистре. |
Пример функциональной диаграммы получения данных от датчика температуры TCN75. В процессе работы контроллер выступает в качестве ведущего (Master) узла шины I²C, выполняя опрос датчика температуры 2 раза в секунду.
В этом примере CANNY7 (Master) выступает в качестве приемника, запрашивающего данные, а термодатчик (Slave) — в качестве передатчика. Такое направление передачи данных задается записью в регистры длины передаваемого сообщения I²C (Рег.длины передачи I²C) и длины принимаемого сообщения I²C (Рег.длины приема I2C) значений отличных от «0», соответствующих количеству передаваемых (запроса температуры) и получаемых (значения температуры) данных.
Для подключения к термодатчику используются каналы контроллера №№8 (SCL) и 9 (SDA). Каждые 500мс в шину, ведомому узлу с адресом 0х90, передается запрос на получение значения температуры. В ответ предполагается получение 2 байт данных.
При получении данных от термодатчика выполняется их предварительная обработка, результаты которой сохраняются в именованной сети «данные датчика».
Режим экономии энергии (режим пониженного энергопотребления)
Для экономии энергии спецификацией LIN предусмотрена возможность перехода всех узлов сети LIN в режим пониженного энегропотребления. Чаще всего, такой переход инициируется ведущим устройством путем отправки соответствующего сообщения в шину, либо осуществляется ведомыми устройствами самостоятельно, при отсутствии активности на шине в течение определенного интервала времени. Выход из режима сна может быть инициирован любым узлом шины. MASTER-узел инициирует пробуждение шины обычным началом опроса SLAVE-узлов. Пробуждение же по инициативе SLAVE-узла, осуществляется кратковременной установкой на линии потенциала GND.
В драйвере LIN контроллеров CANNY 7 для пробуждения шины MASTER-устройству достаточно начать передачу данных или запросов ведомым устройствам. SLAVE-узлы отправляют запрос на пробуждение шины передачей сообщения с любым идентификатором, но имеющим нулевую длину, т. е. «Регистр сообщения передачи LINх LEN» = 0.