Архив автора: admin

STM32 STM32VL Discovery STM32F100RBT6 (урок 10) SPI, практика

STM32 STM32VL Discovery STM32F100RBT6 (урок 10) SPI, практикаSPI_block_diagram

Общее
SPI (англ. Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс, шина SPI) — последовательный синхронный стандарт передачи данных в режиме полного дуплекса, предназначенный для обеспечения простого и недорогого высокоскоростного сопряжения микроконтроллеров и периферии. SPI также иногда называют четырёхпроводным (англ. four-wire) интерфейсом.

В отличие от стандартного последовательного порта (англ. standard serial port), SPI является синхронным интерфейсом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая (ведомая) периферия синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (англ. chip select) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участия в передаче по SPI.

Частота следования битовых интервалов в линиях передачи данных определяется синхросигналом SCK, который генерирует ведущее устройство, ведомые устройства используют синхросигнал для определения моментов изменения битов на линии данных, при этом ведомые устройства никак не могут влиять на частоту следования битовых интервалов. Как в ведущем устройстве, так и в ведомом устройстве имеется счетчик импульсов синхронизации (битов). Счетчик в ведомом устройстве позволяет последнему определить момент окончания передачи пакета. Счетчик сбрасывается при выключении подсистемы SPI, такая возможность всегда имеется в ведущем устройстве. В ведомом устройстве счетчик обычно сбрасывается деактивацией интерфейсного сигнала SS.

Так как действия ведущего и ведомого устройства тактируются одним и тем же сигналом, то к стабильности этого сигнала не предъявляется никаких требований, за исключением ограничения на длительность полупериодов, которая определяется максимальной рабочей частотой более медленного устройства. Это позволяет использовать SPI в системах с низкостабильной тактовой частотой, а также облегчает программную эмуляцию ведущего устройства.

Устройство SPISPI_Single_master_single_slave_application

Шина SPI представляет собой два последовательно соединённых между собой сдвиговых регистра и по каждому тактовому импульсу данные в регистрах сдвигаются. То есть по каждому тактовому импульсу один бит уходит из регистра, остальные биты сдвигаются к выходу, а на входе появляется свободное место, его и занимает вновь пришедший бит.

В SPI используются четыре цифровых сигнала:

  • MOSI — выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому.
  • MISO — вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
  • SCLK — последовательный тактовый сигнал (англ. Serial Clock). Служит для передачи тактового сигнала для ведомых устройств.
  • CS или SS — выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select).

Конкретные имена портов интерфейса SPI могут различаться в зависимости от производителя аппаратных средств, при этом возможны следующие варианты:

  • MOSI: SIMO, SDI (на устройстве), DI, DIN, SI, MTST;
  • MISO: SOMI, SDO (на устройстве), DO, DOUT, SO, MRSR;
  • SCLK: SCK, CLK;
  • SS: nCS, CS, CSB, CSN, nSS, STE, SYNC.

** Важно : Последняя линия включает модуль SPI Slave, причем обычно включение это происходит когда на линии логический “0″, а выключение, когда на линии логическая “1″ (отсюда вход Slave Select слейва, логичнее называть Not Slave Select, то есть когда на линии лог “1″, слейв НЕ выбран). 
Дело в том, что к одному мастеру может быть подключено несколько Slave устройств(линии MISO, MOSI, SCK становятся общими) и конкретное  Slave устройство выбирается Мастером благодаря этому входу. Таким образом это позволяет SPI master обмениваться данными с несколькими устройствами slave, индивидуально обращаясь к каждому устройству, что позволяет избежать конфликта по шинам данных. Но тут кроется сюрприз в виде того, что при настройке нашего модуля в качестве мастера (Master) эта ножка может работать совсем в другом качестве, а именно на вход. Этот вариант поддерживается для возможности реализации шины SPI с несколькими Master(мастерами).

подключение

Где SPI в нашем MK (STM32F100RBT6) ?
В нашем микроконтроллере есть несколько блоков SPI. SPI1 – находится на шине APB2, а другой  SPI2 на шине APB1. В других микроконтроллерах серии можно встретить большее или меньшее число число интерфейсов.

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

SPI_PinsDiscr

Data frame formatSPI_Data_clock_timing_diagram

У нас есть не так много вариантов настройки нашего модуля. При подключении какого-либо устройства к микроконтроллеру по интерфейсу SPI необходимо посмотреть техническую документацию на это устройство и понять всего несколько параметров. Как правило подключаемые устройства к микроконтроллеру это рабы(slave), то есть они будут подчинятся и управляться мастером, а именно нашим микроконтроллером. 
1) Определить в каком режиме мы будем работать. Режимом называется вариант работы CLK – линии тактирования.
2) Определить скорость на которой будем работать. Период импульсов тактирования.
3) Определить старшим битом вперед или младшим и число бит 8 или 16.

4) Определить где какие ножки и все подключить.

Ссылки на комплектующие:
Отладочная плата: STM32VL Discovery (ссылка)
Микроконтроллер: STM32F100RBT6 (
ссылка)
Провод USB :  (ссылка)
Преобразователь USB-UART : FTDI (ссылка)

Макетная плата: (ссылка)
Блок питания на 12V (ссылка)
Преобразователь 12V  в  3,3/5V (ссылка)
Перемычки для макетной платы (ссылка)

SPI Примеры
Progect 1 – Настраиваем SPI_1 и заставляем постоянно слать данные (смотреть на осциллографе)
Progect 2 - Настраиваем SPI_1 и замкнули ножки [ MISO(PA6) - MOSI(PA7) ] таким образом получаем то что отправили
Progect 3 – Настраиваем SPI_1 и SPI_2 (Отправляем из SPI_1  в  SPI_2)

Проект (SPI) (ссылка на скачивание)

Progect 1

Progect 2

Progect 3

STM32 STM32VL Discovery STM32F100RBT6 (урок 10) SPI, теория

STM32 STM32VL Discovery STM32F100RBT6 (урок 10) SPI, теорияSPI_block_diagram

Общее
SPI (англ. Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс, шина SPI) — последовательный синхронный стандарт передачи данных в режиме полного дуплекса, предназначенный для обеспечения простого и недорогого высокоскоростного сопряжения микроконтроллеров и периферии. SPI также иногда называют четырёхпроводным (англ. four-wire) интерфейсом.

В отличие от стандартного последовательного порта (англ. standard serial port), SPI является синхронным интерфейсом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая (ведомая) периферия синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (англ. chip select) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участия в передаче по SPI.

Частота следования битовых интервалов в линиях передачи данных определяется синхросигналом SCK, который генерирует ведущее устройство, ведомые устройства используют синхросигнал для определения моментов изменения битов на линии данных, при этом ведомые устройства никак не могут влиять на частоту следования битовых интервалов. Как в ведущем устройстве, так и в ведомом устройстве имеется счетчик импульсов синхронизации (битов). Счетчик в ведомом устройстве позволяет последнему определить момент окончания передачи пакета. Счетчик сбрасывается при выключении подсистемы SPI, такая возможность всегда имеется в ведущем устройстве. В ведомом устройстве счетчик обычно сбрасывается деактивацией интерфейсного сигнала SS.

Так как действия ведущего и ведомого устройства тактируются одним и тем же сигналом, то к стабильности этого сигнала не предъявляется никаких требований, за исключением ограничения на длительность полупериодов, которая определяется максимальной рабочей частотой более медленного устройства. Это позволяет использовать SPI в системах с низкостабильной тактовой частотой, а также облегчает программную эмуляцию ведущего устройства.

Устройство SPISPI_Single_master_single_slave_application

Шина SPI представляет собой два последовательно соединённых между собой сдвиговых регистра и по каждому тактовому импульсу данные в регистрах сдвигаются. То есть по каждому тактовому импульсу один бит уходит из регистра, остальные биты сдвигаются к выходу, а на входе появляется свободное место, его и занимает вновь пришедший бит.

В SPI используются четыре цифровых сигнала:

  • MOSI — выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому.
  • MISO — вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
  • SCLK — последовательный тактовый сигнал (англ. Serial Clock). Служит для передачи тактового сигнала для ведомых устройств.
  • CS или SS — выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select).

Конкретные имена портов интерфейса SPI могут различаться в зависимости от производителя аппаратных средств, при этом возможны следующие варианты:

  • MOSI: SIMO, SDI (на устройстве), DI, DIN, SI, MTST;
  • MISO: SOMI, SDO (на устройстве), DO, DOUT, SO, MRSR;
  • SCLK: SCK, CLK;
  • SS: nCS, CS, CSB, CSN, nSS, STE, SYNC.

** Важно : Последняя линия включает модуль SPI Slave, причем обычно включение это происходит когда на линии логический “0″, а выключение, когда на линии логическая “1″ (отсюда вход Slave Select слейва, логичнее называть Not Slave Select, то есть когда на линии лог “1″, слейв НЕ выбран).
Дело в том, что к одному мастеру может быть подключено несколько Slave устройств(линии MISO, MOSI, SCK становятся общими) и конкретное  Slave устройство выбирается Мастером благодаря этому входу. Таким образом это позволяет SPI master обмениваться данными с несколькими устройствами slave, индивидуально обращаясь к каждому устройству, что позволяет избежать конфликта по шинам данных. Но тут кроется сюрприз в виде того, что при настройке нашего модуля в качестве мастера (Master) эта ножка может работать совсем в другом качестве, а именно на вход. Этот вариант поддерживается для возможности реализации шины SPI с несколькими Master(мастерами).

подключение

Где SPI в нашем MK (STM32F100RBT6) ?
В нашем микроконтроллере есть несколько блоков SPI. SPI1 – находится на шине APB2, а другой  SPI2 на шине APB1. В других микроконтроллерах серии можно встретить большее или меньшее число число интерфейсов.

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

SPI_PinsDiscr

Data frame formatSPI_Data_clock_timing_diagram

У нас есть не так много вариантов настройки нашего модуля. При подключении какого-либо устройства к микроконтроллеру по интерфейсу SPI необходимо посмотреть техническую документацию на это устройство и понять всего несколько параметров. Как правило подключаемые устройства к микроконтроллеру это рабы(slave), то есть они будут подчинятся и управляться мастером, а именно нашим микроконтроллером. 
1) Определить в каком режиме мы будем работать. Режимом называется вариант работы CLK – линии тактирования.
2) Определить скорость на которой будем работать. Период импульсов тактирования.
3) Определить старшим битом вперед или младшим и число бит 8 или 16.

4) Определить где какие ножки и все подключить.

Различные варианты связи SPI устройств
Есть несколько вариантов использования нашего блока SPI. Главным образом устройства SPI делятся на два типа Master или Slave, но сейчас мы рассмотрим какие есть варианты соединения SPI устройств между собой.
Можно выделить 4-е варианта работы нашего блока :
1)  Две линии данных      (передача-прием)  [ BIDIMODE = 0, RXONLY = 0]
2)  Одна линия данных   (передача-прием) [ BIDIMODE = 1, BIDIOE = направление]
3)  Одна линия данных   (только прием)      [ BIDIMODE = 1, RXONLY=1]
4)  Одна линия данных   (только передача) [ BIDIMODE = 0, RXONLY = 0]
** Видим в пункте 4 та же настройка что и пункт 2. Оно все так и есть и производитель просто предлагает игнорировать приемную часть нашего микроконтроллера и соответствующую ножку можно использовать как ножку общего назначения.

Встроенный механизм счета CRC в блок SPI
Замечательные новости ведь, мы видим встроенный (аппаратный) блок счета CRC в составе нашего, широко известного интерфейса SPI. Это должно сказать нам о том, что теперь у нас есть власть легко и просто обеспечить передачу пакетов данных с посчитанной CRC для этого пакета, а на принимающей стороне так же легко проверить целостность пакета.

Вычисление CRC разрешается установкой бита CRCEN в регистре SPI_CR1. Это действие сбрасывает регистры CRC (SPI_RXCRCR и SPI_TXCRCR). В полном дуплексе или в режиме только передачи, когда передача управляется программно (CPU mode), необходимо записать бит CRCNEXT немедленно после последней передаваемой порции данных, записанной в SPI_DR. По окончании последней передачи данных будет передано значение SPI_TXCRCR. Фактически бит CRCNEXT должен быть записан перед окончанием передачи/приема последней порции данных.

Чтобы очистить CRC, выполните следующую процедуру (Регистры то на чтение):
1. Запретите SPI (SPE = 0).
2. Очистите бит CRCEN.
3. Установите бит CRCEN.
4. Разрешите SPI (SPE = 1).

Управление выводом выборки Slave (NSS)
Аппаратное или программное управление выводом NSS может быть установлено битом SSM в регистре SPI_CR1. [Биты  SSM и SSI]

• Программное управление NSS. когда SSM = 1. Выборка slave select управляется внутри микроконтроллера программно по значению бита SSI в регистре SPI_CR1. Внешний вывод NSS остается свободным, и может использоваться в приложении для других целей.
• Аппаратное управление NSS, когда SSM = 0. В этом состоянии возможны 2 варианта конфигурации в зависимости от того, как сконфигурирован выход NSS (бит SSOE в регистре SPI_CR2).
– выход NSS разрешен (SSM = 0, SSOE = 1). Эта конфигурация используется только когда устройство работает в режиме master. Сигнал NSS переходит в лог. 0, когда master начинает обмен и остается в лог. 0, пока SPI не будет запрещен.
– выход NSS запрещен (SSM = 0, SSOE = 0). Эта конфигурация разрешает возможность multimaster для устройств, работающих в режиме master. Для устройств, которые установлены как slave, вывод NSS работает как классический вход NSS: slave выбирается и становится активным, когда NSS переходит в лог. 0, и деактивируется, когда NSS переходит в лог. 1.

Зачем при режиме мастер опрашивается вывод NSS?
Есть вариант строить систему с несколькими мастерами(Master) на шине SPI, но что бы не было конфликтов введен определенный функционал для ножки NSS в режиме Master. Как мы знаем в этом режиме она если используется, то может быть только входом и должна быть притянута к лог единице, если на этот вход подается ноль, то у нас возникает штатная ситуация отключения модуля SPI [Master mode fault (MODF)].

Master mode fault (MODF), флаг ошибки режима master. Событие этой ошибки происходит, когда у устройства master есть вывод NSS, подтянутый к уровню лог. 0 (NSS в аппаратном режиме), или когда бит SSI равен 0 (когда NSS в программном режиме), это автоматически установит бит MODF. Master mode fault влияет на периферийное устройство SPI следующим образом:

• Бит MODF устанавливается, и генерируется прерывание SPI, если установлен бит ERRIE.
• Очищается бит SPE. Это блокирует все выходные сигналы от устройства, и запрещает интерфейс SPI.
• Очищается бит MSTR, так что устройство принудительно переходит в режим slave.

Continuous communication using DMA
Это то, с чем будем знакомиться когда изучим устройство DMA в нашем МК и тогда будут идти статьи про использования этого мощного инструмента во всех или почти всех периферийных блоках в составе нашего микроконтроллера. Просто пока надо сказать что DMA это блок, позволяющий разгрузить процессор и позволить определенному механизму перемещать данные, минуя процессор.

Прерывания (interrupts)
Разное может произойти в процессе приема-передачи данных по USART. Для полного и надежного контроля за процессом передачи данных мы можем реагировать определенным образом на все доступные прерывания. Важно увидеть организацию прерываний в виде дерева, из чего следует, что в прерывании надо будет проверять, что именно случилось читая статусный регистр, содержащий флаги прерываний. В документации есть удобная табличка содержащее описание прерывания – выставляемый флаг – бит разрешения этого прерывания.

SPI_interrupt_requests

Ссылки на комплектующие:
Отладочная плата: STM32VL Discovery (ссылка)
Микроконтроллер: STM32F100RBT6 (
ссылка)
Провод USB :  (ссылка)
Преобразователь USB-UART : FTDI (ссылка)

Макетная плата: (ссылка)
Блок питания на 12V (ссылка)
Преобразователь 12V  в  3,3/5V (ссылка)
Перемычки для макетной платы (ссылка)

Регистры (SPI)

SPI_CR1  [0x0000]SPI_CR1Описание: Регистр конфигурационный под номером один, состоящий из различных битов – настройки, которые нужно установить для достижения определенного режима работы модуля SPI.
Биты:
Bit 15    BIDIMODE:    Bidirectional data mode enable
Описание: Этот бит определяет по скольким линиям данных будет обмен.
0:  Режим 2-х однонаправленных линий данных.

1:  Режим 1-ой двунаправленной линии данных

Bit 14    BIDIOE:    Output enable in bidirectional mode
Описание: 
Этот бит до определяет работу SPI в режиме [1-ой двунаправленной линии данных](BIDImode). Выбираем, что хотим делать передавать или принимать.
0:  Выход отключен (можем только принимать)
1:  Вход отключен (можем только отправлять)

Bit 13    CRCEN:    Hardware CRC calculation enable
Описание: 
Этот бит разрешает аппаратный счет CRC (CRC8 или CRC16), этот функционал встроен в блок SPI. При установке этого бита происходит аппаратный сброс регистров SPI_RXCRCR и SPI_TXCRCR.
0:  Разрешить
1:  Запретить

Bit 12    CRCNEXT:    CRC transfer next
Описание: 
Этот бит необходимо установить для получения результата счета CRC. В случае когда мы передаем массив данных мы можем потом установить этот бит и в принимающее устройство отправится насчитанное значение контрольной суммы из регистра SPI_TXCRCR. Когда мы принимаем данные и знаем что приняли последний фрейм устанавливаем этот бит, тем самым говорим,что теперь передатчик передаст нам CRC, потом лезем в регистр статуса и смотрим флаг ошибки счета CRC (бит CRCERR – устанавливается при ошибке проверки контрольной суммы при приеме). 
0:  Принимается/Передается  фрейм данных 
1:  Принимается/Передается  фрейм CRC 

Bit 11    DFF:    Data frame format
Описание: 
Этот бит определяем длину фреймов (по сколько бит передаем/принимаем). Этот бит можно менять только если модуль не активен (бит SPE = 0).
0:  8 Бит
1:  16 Бит

Bit 10    RXONLY:    Receive only
Описание: 
Этот бит определяет, что у нас будет работать. Мы выбираем, что мы хотим [только принимать (полу дуплекс)] или [принимать/передавать (полный дуплекс)]. 
0:  Полный дуплекс (прием и передача)
1:  Полу дуплекс (только прием)

Bit 9    SSM:    Software slave management
Описание: 
Этот бит включает программное управление ведомым. Когда этот бит установлен, вместо уровня на входе NSS контролируется состояние бита SSI.
0:  Разрешить
1:  Запретить

Bit 8    SSI:    Internal slave select
Описание: 
Этот бит имеет значение только в случае, когда бит SSM установлен в 1(так называемое программное управление). Записывая значение в этот бит, мы можем имитировать сигнал NSS ведь теперь при установке бита SSM мы игнорируем лог уровень на ножке NSS и берем значение из нашего бита SSI.

Bit 7    LSBFIRST:    Frame format
Описание: 
Этот бит определяет формат фреймов (Старшим разрядом вперед[MSB] или младшим[LSB]). 
0:  [MSB] – Старшим разрядом вперед
1:  [LSB] – Младшим разрядом вперед

Bit 6    SPE:    SPI enable
Описание: 
Этот бит разрешает или запрещает работу нашего блока SPI. 
0:  Запретить
1:  Разрешить

Bit 5:3    BR[2:0]:    Baud rate control
Описание: 
Эти биты определяют скорость обмена(Baud rate), другими словами определяем пред делитель входной частоты шины для нашего блока SPI. Эта настройка определяет с какой частотой будет передача – прием данных при мастер режиме, ведь именно в этом режиме мастер генерирует CLK, а вот частота этих импульсов определяется именно тут.
000: fPCLK/2
001: fPCLK/4
010: fPCLK/8
011: fPCLK/16
100: fPCLK/32
101: fPCLK/64
110: fPCLK/128
111: fPCLK/256

Bit 2    MSTR:    Master selection
Описание: 
Этот бит определяет в каком режиме мы будем работать Мастер(Master) или Раб(Slave)
0:  Выбираем режим Мастер(Master/Ведущий)
1:  Выбираем режим Раб(Slave/Ведомый)

Bit 1    CPOL:    Clock polarity
Описание: 
Этот бит определяет полярность тактового сигнала (полярность и фаза это один из 4-ех режимов). 
0:  Линия CLK в логическом нуле[0], когда ничего не передается (idle)
1:  Линия CLK в логической единице[1], когда ничего не передается (idle)

Bit 0    CPHA:    Clock phase
Описание: 
Этот бит определяет фазу тактового сигнала (полярность и фаза это один из 4-ех режимов).
0:  Не обнаружили Break
1:  Обнаружили Break

SPI_CR2  [0x0000]SPI_CR2Описание: Регистр конфигурационный под номером два, состоящий из различных битов – настройки, которые нужно установить для достижения определенного режима работы модуля SPI.
Биты:
Bit 7    TXEIE:    Tx buffer empty interrupt enable
Описание: Этот бит разрешает прерывание при опустошении буфера передачи Tx buffer. Флаг прерывания == TXE.
0:  Запретить

1:  Разрешить

Bit 6    RXNEIE:    RX buffer not empty interrupt enable
Описание: 
Этот бит разрешает прерывание в момент, когда буфер на прием не пуст. Значит мы что-то приняли и надо бы это вычитать из буфера Tx buffer. Флаг прерывания == RXNE.
0:  Запретить
1:  Разрешить

Bit 5    ERRIE:    Error interrupt enable
Описание: 
Этот бит разрешает прерывание при обнаружении ошибки. Есть несколько вариантов и соответственно флагов(CRCERR, OVR, MODF). 
0:  Запретить
1:  Разрешить

Bit 4:3    R[1:0]:    Reserved, must be kept at reset value.

Bit 2    SSOE:    SS output enable
Описание: 
Этот бит разрешает или запрещает работу функционала ножки SS (в Master mode), другими словами это означает, что наш блок SPI берет под контроль ножку SS или нет.
0:  Запретить
1:  Разрешить

Bit 1    TXDMAEN:    Tx buffer DMA enable
Описание: 
Этот бит активирует/деактивирует запросы DMA для буфера передачи Tx buffer. Когда этот бит установлен, запрос DMA формируется при установке флага TXE в регистре SPI_SR
0:  Запретить
1:  Разрешить

Bit 0    RXDMAEN:    Rx buffer DMA enable
Описание: 
Этот бит активирует/деактивирует запросы DMA для буфера приема Rx buffer. Когда этот бит установлен, запрос DMA формируется при установке флага RXNE в регистре SPI_SR
0:  Запретить
1:  Разрешить

SPI_SR  [0x0000]SPI_SRОписание: Статусный регистр, состоящий из различных битов – флагов, которые устанавливаются аппаратно когда что-то значимое происходит. Важно знать, что флаги ошибок влияют сильно влияют на состояние нашего SPI блока и это влияние описано в даташите (21.3.10 Error flags).
Биты:
Bit 7    BSY:    Busy flag
Описание: Это флаг занятости. Устанавливается аппаратно в случае, когда происходит обмен данными или буфер передатчика содержит данные.
0:  SPI модуль занят

1:  SPI модуль свободен

Bit 6    OVR:    Overrun flag
Описание: 
Это флаг переполнения. Устанавливается аппаратно в случае, когда начали поступать новые данные, а мы еще не вычитали данные из буфера на прием. Важно помнить что у нас регистр данных и сдвиговый регистр, значит данные мы еще не потеряли, но можем, если передатчик начнет что-то нам передавать, а мы не вычитаем регистр данных, чтобы наш SPI мог переместить туда данные из своего сдвигового регистра.
0:  Не случилось
1:  Случилось

Bit 5    MODF:    Mode fault
Описание: 
Это флаг ошибки режима. Устанавливается аппаратно случае, когда обнаружен сбой в работе (флаг сбрасывается программно). Это может означать, что при работе устройства в режиме Master, когда при этом на его вход NSS поступил сигнал низкого уровня, переводящий устройство в режим Slave. Это серьезная ошибка и поэтому есть сильное влияние установки этого бита на наш блок SPI. А именно аппаратная очистка битов SPE и MSTR.
0:  Не случилось
1:  Случилось

Bit 4    CRCERR:    CRC error flag
Описание: 
Это флаг ошибки CRC. Устанавливается аппаратно в случае ошибки CRC (флаг сбрасывается программно). Суть в том, что если мы разрешили работу этого  блока в составе нашего SPI и приняли посылку с CRC от передатчика, то хотим знать совпало CRC или нет.
0:  Не случилось
1:  Случилось

Bit 3:2    R[1:0]:    Reserved, must be kept at reset value.

Bit 1    TXE:    Transmit buffer empty
Описание: 
Это флаг буфер на отправку пуст. Устанавливается аппаратно в случае, когда буфер на отправку пуст, что говорит о том, что теперь мы можем записать в этот буфер очередное значение на отправку. 
0:  Tx Bufer – Не пуст
1:  Tx Bufer – Пуст

Bit 0    RXNE:    Receive buffer not empty
Описание: 
Это флаг буфер на прием не пуст. Устанавливается аппаратно в случае, когда буфер на прием не пуст, что говорит о том, что теперь должны вытащить это значение, освободив место для новых приходящих данных. 
0:  Rx Bufer – Пуст
1:  Rx Bufer – Не пуст

SPI_DR  [0x0002]SPI_DRОписание: Регистр данных.
Биты:
Bits 15:0    DR[15:0]:    Data register
Описание: Это регистр данных, который на самом деле является двумя регистрами. Просто операции записи и чтения происходят над разными регистрами. Такой подход удобен, ведь теперь мы можем использовать одно имя регистра записывая данные на отправку и читать полученные данные. Важно учитывать выбранную длину фреймов, от нее зависит количество используемых бит этого регистра (16 или 8).

 

SPI_CRCPR  [0x0007]SPI_CRCPRОписание: Регистр хранения полинома для аппаратного счета CRC в составе блока SPI.
Биты:
Bits 15:0    CRCPOLY[15:0]:    CRC polynomial register
Описание: Это регистр для хранения полинома вычисления CRC. После сброса регистр содержит полином 0×0007, который может быть при необходимости программно изменен на другой.

SPI_RXCRCR  [0x0000]SPI_RXCRCRОписание: Регистр хранения контрольной суммы, которая посчиталась для принятых данных.
Биты:
Bits 15:0    RXCRC[15:0]:    Rx CRC register
Описание: Это регистр вычисленной CRC для принятого потока данных. Когда вычисление CRC разрешено, биты RxCRC[15:0] содержат вычисленную контрольную сумму от последовательно принятых байт. Этот регистр сбрасывается, когда в бит CRCEN в регистре SPI_CR1 записывается 1. CRC вычисляется с задействованием полинома, запрограммированного в регистре SPI_CRCPR.

 

SPI_TXCRCR  [0x0000]SPI_TXCRCRОписание: Регистр хранения контрольной суммы, которая посчиталась для отправляемых данных.
Биты:
Bits 15:0    TXCRC[15:0]:    Tx CRC register
Описание: Это  регистр вычисленной CRC для переданного потока данных. Когда вычисление CRC разрешено, биты TxCRC[15:0] содержат вычисленную контрольную сумму от последовательно переданных байт. Этот регистр сбрасывается, когда в бит CRCEN в регистре SPI_CR1 записывается 1. CRC вычисляется с задействованием полинома, запрограммированного в регистре SPI_CRCPR.

STM32 STM32VL Discovery STM32F100RBT6 (урок 9) USART, практика

STM32 STM32VL Discovery STM32F100RBT6 (урок 9) USART, практика

Main

Общее
USART – Универсальный синхронный – асинхронный приемопередатчик. Это узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. Преобразует передаваемые данные в последовательный вид так, чтобы было возможно передать их по цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применяется в компьютерной технике.

Передача данных в UART осуществляется по одному биту в равные промежутки времени. Этот временной промежуток определяется заданной скоростью UART и для конкретного соединения указывается в бодах (что в данном случае соответствует битам в секунду). Существует общепринятый ряд стандартных скоростей: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 бод. Скорость (S, бод) и длительность бита (T, секунд) связаны соотношением T = 1/S . Скорость в бодах иногда называют сленговым словом битрейт.
Помимо собственно информационного потока, UART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты. При приёме эти лишние биты удаляются из потока. Обычно стартовый и стоповый биты обрамляют один байт информации (8 бит), однако встречаются реализации UART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит. Обрамленные стартом и стопом биты являются минимальной посылкой. Некоторые реализации UART позволяют вставлять два стоповых бита при передаче для уменьшения вероятности рассинхронизации приёмника и передатчика при плотном трафике. Приёмник игнорирует второй стоповый бит, воспринимая его как короткую паузу на линии.

Принято соглашение, что пассивным (в отсутствие потока данных) состоянием входа и выхода UART является логическая 1. Стартовый бит всегда логический 0, поэтому приёмник UART ждёт перепада из 1 в 0 и отсчитывает от него временной промежуток в половину длительности бита (середина передачи стартового бита). Если в этот момент на входе всё ещё 0, то запускается процесс приёма минимальной посылки. Для этого приёмник отсчитывает 9 битовых длительностей подряд (для 8-битных данных) и в каждый момент фиксирует состояние входа. Первые 8 значений являются принятыми данными, последнее значение проверочное (стоп-бит). Значение стоп-бита всегда 1, если реально принятое значение иное, UART фиксирует ошибку.

Для формирования временных интервалов передающий и приёмный UART имеют источник точного времени (тактирования). Точность этого источника должна быть такой, чтобы сумма погрешностей (приёмника и передатчика) установки временного интервала от начала стартового импульса до середины стопового импульса не превышала половины (а лучше хотя бы четверти) битового интервала. Для 8-битной посылки 0,5/9,5 = 5 % (в реальности не более 3 %). Поскольку эта сумма ошибок приёмника и передатчика плюс возможные искажения сигнала в линии, то рекомендуемый допуск на точность тактирования UART — не более 1,5 %.
Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например, для 8-битных посылок формата 8-N-1синхронизирующие биты занимают 20 % потока, что для физической скорости 115 200 бод даёт битовую скорость данных 92 160 бит/с или 11 520 байт/с.

Устройство USARTUSART_Hardware_flow_control_between_two_USARTs

Для обеспечения связи устройств по USART, у нас есть ряд ножек с зарезервированными именами и стандартизированным функционалом.
Tx – Передача данных (ножка передатчика)
По этой линии мы отправляем данные от передающего устройства в принимающее. Из этого следует, что эту ножку необходимо соединить с ножкой Rx на принимающей стороне.
Rx – Прием данных (ножка приемника)
По этой линии мы принимаем данные от передающего устройства. Из этого следует, что эту ножку необходимо соединить с ножкой Tx на отправляющей стороне.
Ck – Синхронизация передачи данных (ножка синхронизации)
Эта ножка нужна для обеспечения синхронной передачи данных. Во время передачи данных, передатчик помимо формирования данных на ножке Tx формирует на ножке Ck стробы синхронизации, нужные для определения моментов, когда приемнику следует считывать данные. Таким образом управление ножкой Ck это работа передатчика, а у приемника эта ножка является входом.
RTS – Request To Send (запрос передачи)(ножка разрешения передачи данных)
Дело в том, что внутреннее устройство подключаемого нами устройства по UART может быть не всегда точно известно. И вполне вероятна ситуация что входной буфер приемника заполнился и принимать уже ничего не может, так как в данный момент хранить данные не где. Для того, чтобы приемник имел возможность сказать передающему устройству : стой!, подожди!, не надо мне слать данные!, нужна эта ножка RTS у приемника, а у передатчика соответственно есть ножка которая называется CTS, которая является входом и соединяется с RTS. Таким образом, передатчик прежде чем передать данные смотрит на ножку RTS приемника, но так как она должна быть соединена с входом передатчика CST, то можно сказать, что происходит опрос состояния входа CST передатчика.
CST - Clear To Send (очищен для передачи)
Собственно вход передатчика, на который необходимо подключить выход передатчика RTS. Если подключенное устройство не выставит на этом входе сигнал готовности приема данных, то передача не начнется.

Где USART в нашем MK (STM32F100RBT6) ?
В нашем микроконтроллере есть несколько USART. USART1 – находится на шине APB2, а два других USART2 и USART3 на шине APB1. В других микроконтроллерах серии можно встретить большее число USART, но можно обнаружить, что у некоторых будет урезанный функционал.USART_mode_configuration
Глядя на картинку ниже, можно определить, какие ножки определенного USART на каком порту находятся. Необходимо не забывать про возможность ремапа, то есть изменение ножки, которую может взять под контроль блок USART.USART_PinsDiscr

USART Примеры
Общее : Мы хотим настроить первый USART в составе микроконтроллера, для передачи данных. У нас есть ПК и преобразователь FTDI + терминальная программа, значит с одной стороны все готово. Для USART в составе микроконтроллера нам надо найти ножки для подключения соответственно к FTDI + не забыть, что земля должна быть общей. Программы написаны с использованием стандартных библиотек, что может быть странным, ведь мы в первой части учили регистры и их биты, но как бы на прямую не используем их. Тут возникает вопрос ведь можно было бы изучать ф-ии стандартной библиотеки и на основе их знать на что способен USART stm32 и как его настроить. Но я считаю такой подход верным, так как изучение регистров есть самое близкое из возможно необходимого расстояния, на которое мы можем подобраться к реальным процессам, протекающим в МК. 

Progect 1 – USART  постоянно отправляет  переменную, которая увеличивается на единичку.
Progect 2 - USART  принимает что-то и это же шлет назад.

Ссылки на комплектующие:
Отладочная плата: STM32VL Discovery (ссылка)
Микроконтроллер: STM32F100RBT6 (
ссылка)
Провод USB :  (ссылка)
Преобразователь USB-UART : FTDI (ссылка)

Макетная плата: (ссылка)
Блок питания на 12V (ссылка)
Преобразователь 12V  в  3,3/5V (ссылка)
Перемычки для макетной платы (ссылка)

Скачать проекты(ссылка)

Progect 1 

Progect 2

STM32 STM32VL Discovery STM32F100RBT6 (урок 9) USART, теория

STM32 STM32VL Discovery STM32F100RBT6 (урок 9) USART, теория

Main

Общее
USART – Универсальный синхронный – асинхронный приемопередатчик. Это узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. Преобразует передаваемые данные в последовательный вид так, чтобы было возможно передать их по цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применяется в компьютерной технике.

Передача данных в UART осуществляется по одному биту в равные промежутки времени. Этот временной промежуток определяется заданной скоростью UART и для конкретного соединения указывается в бодах (что в данном случае соответствует битам в секунду). Существует общепринятый ряд стандартных скоростей: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 бод. Скорость (S, бод) и длительность бита (T, секунд) связаны соотношением T = 1/S . Скорость в бодах иногда называют сленговым словом битрейт.
Помимо собственно информационного потока, UART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты. При приёме эти лишние биты удаляются из потока. Обычно стартовый и стоповый биты обрамляют один байт информации (8 бит), однако встречаются реализации UART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит. Обрамленные стартом и стопом биты являются минимальной посылкой. Некоторые реализации UART позволяют вставлять два стоповых бита при передаче для уменьшения вероятности рассинхронизации приёмника и передатчика при плотном трафике. Приёмник игнорирует второй стоповый бит, воспринимая его как короткую паузу на линии.

Принято соглашение, что пассивным (в отсутствие потока данных) состоянием входа и выхода UART является логическая 1. Стартовый бит всегда логический 0, поэтому приёмник UART ждёт перепада из 1 в 0 и отсчитывает от него временной промежуток в половину длительности бита (середина передачи стартового бита). Если в этот момент на входе всё ещё 0, то запускается процесс приёма минимальной посылки. Для этого приёмник отсчитывает 9 битовых длительностей подряд (для 8-битных данных) и в каждый момент фиксирует состояние входа. Первые 8 значений являются принятыми данными, последнее значение проверочное (стоп-бит). Значение стоп-бита всегда 1, если реально принятое значение иное, UART фиксирует ошибку.

Для формирования временных интервалов передающий и приёмный UART имеют источник точного времени (тактирования). Точность этого источника должна быть такой, чтобы сумма погрешностей (приёмника и передатчика) установки временного интервала от начала стартового импульса до середины стопового импульса не превышала половины (а лучше хотя бы четверти) битового интервала. Для 8-битной посылки 0,5/9,5 = 5 % (в реальности не более 3 %). Поскольку эта сумма ошибок приёмника и передатчика плюс возможные искажения сигнала в линии, то рекомендуемый допуск на точность тактирования UART — не более 1,5 %.
Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например, для 8-битных посылок формата 8-N-1синхронизирующие биты занимают 20 % потока, что для физической скорости 115 200 бод даёт битовую скорость данных 92 160 бит/с или 11 520 байт/с.

Устройство USARTUSART_Hardware_flow_control_between_two_USARTs

Для обеспечения связи устройств по USART, у нас есть ряд ножек с зарезервированными именами и стандартизированным функционалом.
Tx – Передача данных (ножка передатчика)
По этой линии мы отправляем данные от передающего устройства в принимающее. Из этого следует, что эту ножку необходимо соединить с ножкой Rx на принимающей стороне.
Rx – Прием данных (ножка приемника)
По этой линии мы принимаем данные от передающего устройства. Из этого следует, что эту ножку необходимо соединить с ножкой Tx на отправляющей стороне.
Ck – Синхронизация передачи данных (ножка синхронизации)
Эта ножка нужна для обеспечения синхронной передачи данных. Во время передачи данных, передатчик помимо формирования данных на ножке Tx формирует на ножке Ck стробы синхронизации, нужные для определения моментов, когда приемнику следует считывать данные. Таким образом управление ножкой Ck это работа передатчика, а у приемника эта ножка является входом.
RTS – Request To Send (запрос передачи)(ножка разрешения передачи данных)
Дело в том, что внутреннее устройство подключаемого нами устройства по UART может быть не всегда точно известно. И вполне вероятна ситуация что входной буфер приемника заполнился и принимать уже ничего не может, так как в данный момент хранить данные не где. Для того, чтобы приемник имел возможность сказать передающему устройству : стой!, подожди!, не надо мне слать данные!, нужна эта ножка RTS у приемника, а у передатчика соответственно есть ножка которая называется CTS, которая является входом и соединяется с RTS. Таким образом, передатчик прежде чем передать данные смотрит на ножку RTS приемника, но так как она должна быть соединена с входом передатчика CST, то можно сказать, что происходит опрос состояния входа CST передатчика.
CST - Clear To Send (очищен для передачи)
Собственно вход передатчика, на который необходимо подключить выход передатчика RTS. Если подключенное устройство не выставит на этом входе сигнал готовности приема данных, то передача не начнется.

Где USART в нашем MK (STM32F100RBT6) ?
В нашем микроконтроллере есть несколько USART. USART1 – находится на шине APB2, а два других USART2 и USART3 на шине APB1. В других микроконтроллерах серии можно встретить большее число USART, но можно обнаружить, что у некоторых будет урезанный функционал.USART_mode_configuration
Глядя на картинку ниже, можно определить, какие ножки определенного USART на каком порту находятся. Необходимо не забывать про возможность ремапа, то есть изменение ножки, которую может взять под контроль блок USART.USART_PinsDiscr

USART character descriptionUSART_WordLength_Programming

Теперь пришло время немного пояснить как выглядят возможные осциллограммы передачи данных. Полезно знать как именно на физическом уровне происходит передача данных от одного устройства в другое по средством USART. Мы будем говорить о возможностях именно нашего блока USART представленного в микроконтроллере STM32F100RBT6. Есть несколько вариантов как будет выглядеть осциллограмма передачи данных.
1) BAUD RATE (скорость обмена)
Этот параметр определяет какое время выделяется на передачу одного бита. Увеличиваем скорость значит время уменьшается.
2) PARITY BIT (контроль четности – паритет)
Это не обязательный бит, который можно включать в посылки с целью увеличении надежности передачи данных. Этот бит говорит четное или не четное количество единиц в передаваемой посылке. Есть еще вариант настроит обратную ситуацию и назвать её бит не четности.
3) STOP BIT (стоп бит)
Это обязательный бит, но есть небольшая вариативность его использования. Вот варианты (половина, один, полтора, два):[0,5 / 1 / 1,5 / 2]
4) CLOCK POLARITY  (полярность линии синхронизации)
Этот параметр имеет место только в синхронном режиме передачи данных и определяет лог уровень линии синхронизации в свободном состоянии.
4) CLOCK PHASE  (фаза линии синхронизации)
Этот параметр имеет место только в синхронном режиме передачи данных и определяет лог уровень линии синхронизации в свободном состоянии.
5) LAST BIT CLOCK PULSE (импульс на последний бит)
Это относится опять к синхронной реализации и можно настроить делать ли такт синхронизации на последний бит.

Различные хитрые варианты использования USART
Есть несколько вариантов немного не стандартного использования нашего блока USART. Привычным или обычным видом использования я называю все то, о чем речь шла выше, но другие хитрые варианты использования будут совсем скромно описаны. Эти режимы работы требуют отдельного рассмотрения и приведения соответствующего кода.

Multiprocessor communication
Этот режим позволяет сделать некую сеть устройств подключенных таким образом что есть один мастер и куча рабов. Но для того чтобы нужный раб понял что мастер желает общаться именно с ним, есть механизм адресации конкретного раба. Есть хитрость работы в этом режиме которая заключается в том, что мы можем передавать или данные или адрес. И эти пакеты будут отличаться тем, что если самый старший бит 1, то это адрес, а 0 это данные. Теперь можно вспомнить про 9-ти битный режим работы и он как раз окажется весьма удобным для нас. После получения байта с адресом(4-е бита), выполняется проверка адреса, и если это не наш пакет — то все остальное до следующего пакета с адресом — игнорируется. Причем игнорируется аппаратно — прерывания не возникает. Все это счастье настраивается рядом битов, описание которых будет в разделе о регистрах.

USART_CR1 –  ( WAKE, RWU ),  USART_CR2 -  ( ADD )
На картинке два режима. сначала WAKE = 0 // потом WAKE = 1.USART_Mute_mode_using_Idle_line_detection USART_Mute_mode_using_address_mark_detection

LIN (local interconnection network) mode
Это стандарт промышленной сети, разработанный консорциумом европейских автопроизводителей и других известных компаний, включая Audi AG, BMW AG, Daimler Chrysler AG, Motorola Inc., Volcano Communications Technologies AB, Volkswagen AG и VolvoCar Corporation. Протокол LIN предназначен для создания дешёвых локальных сетей обмена данными на коротких расстояниях. Он служит для передачи входных воздействий, состояний переключателей на панелях управления и так далее, а также ответных действий различных устройств, соединённых в одну систему через LIN, происходящих в так называемом «человеческом» временном диапазоне (порядка сотен миллисекунд).

Структура шины представляет собой нечто среднее между I2C и RS-232 или можно вспомнить 1-wire. Шина подтягивается вверх к источнику питания через резистор в каждом узле и вниз через открытый коллекторный переход приемопередатчика, как в I2C. Но вместо стробирующей линии, каждый передаваемый байт обрамляется стартовым и стоповым битами и передается асинхронно, как в RS-232.image001USART synchronous mode
Этот режим упоминался выше и все же не является чем то из ряда вон, но все же решил определить его описание в эту часть статьи. Этот режим работы на самом деле очень легко понять если вы знакомы с SPI. Дело в том, что синхронный режим работы USART превращается как бы в SPI. Точнее становится очень на него похожим и появляется возможность подключать устройства с SPI интерфейсом. На картинке ниже видим поясняющие осциллограммы для быстрого понимания синхронного режима передачи данных по USART. Приведем картинку только для варианта 8-и битного режима передачи данных.USART_data_clock_timing_diagram_M0

Single-wire half-duplex communication
Вот супер режим, позволяющий работать в полу дупликсе. Мы можем уменьшить число соединительных линий, сказав, что в нашей системе мы все операции перемещения данных будем делать друг за другом. Дело в том, что ранее мы как бы в один момент перемещали данные как в том, так и в другом направлении. Этим можно пожертвовать и сделать одну универсальную ножку, способную как передавать, так и принимать. В нашем микроконтроллере такой маневр возможен и теперь у нас Single-wier режим работы (один провод). Этот режим позволяет легко подключать устройства с интерфейсом 1-wier.Simplex-half-fullSmartcard mode 
Очень интересный способ использования USART. Мы теперь можем попробовать наладить связь с смарт картами. В нашем случае поддерживаются контактные смарт карты стандарта ISO 7816-3. Наиболее массовые контактные смарткарты — это SIM-карты сотовой связи, таксофонные карты, современные банковские карточки. Таким образом берем карточку находим его распиновку и подаем питание и подключаем наш UART к выводам Tx и Rx соответственно. Конечно же не забыв настроить режим работы с смарт картами. Интересно, что в описании от stm есть абзац про то, что смарт карту можно подключить в режиме полу дуплексе.

IrDA SIR ENDEC block
Вот так сюрприз, неожиданная находка поддержки функционала появившегося в мобильных телефонах и исчезнувшая на моих глазах. Системы передачи данных по инфракрасному каналу связи появились в связи с необходимостью ведения обмена данными между переносными компьютерами и периферийным оборудованием. IrDA стандарт является дешевым и практическим протоколом передачи данных по инфракрасному каналу связи. Есть два режима работы, это обычный и энергосберегающий.

Из картинки выше видно во что превращается на выходе посылка по USART, когда мы используем IrDA модуль. По IrDA стандарту ИК импульс начинается в центре битового периода и имеет длительность 3/16 длительности битового периода.USART_IrDA_data_modulation_3_16Continuous communication using DMA
Это то с чем будем знакомиться когда изучим устройство DMA в нашем мк и тогда будут идти статьи про использования этого мощного инструмента во всех или почти всех периферийных блоках в составе нашего микроконтроллера. Просто пока надо сказать что DMA это плок позволяющий разгрузить процессор и позволить определенному механизму перемещать данные миную процессор.

Прерывания (interrupts)
Разное может произойти в процессе приема-передачи данных по USART. Для полного и надежного контроля за процессом передачи данных мы можем реагировать определенным образом на все доступные прерывания. Важно увидеть организацию прерываний в виде дерева, из чего следует, что в прерывании надо будет проверять, что именно случилось читая статусный регистр, содержащий флаги прерываний. В документации есть удобная табличка содержащее описание прерывания – выставляемый флаг – бит разрешения этого прерывания.USART_interrupt_requests

USART_interrupt_mapping_diagram

Ссылки на комплектующие:
Отладочная плата: STM32VL Discovery (ссылка)
Микроконтроллер: STM32F100RBT6 (
ссылка)
Провод USB :  (ссылка)
Преобразователь USB-UART : FTDI (ссылка)

Макетная плата: (ссылка)
Блок питания на 12V (ссылка)
Преобразователь 12V  в  3,3/5V (ссылка)
Перемычки для макетной платы (ссылка)

Регистры (USART)

USART_SR  [0x00c0]USART_SRОписание: Статусный регистр, состоящий из различных битов – флагов, которые устанавливаются аппаратно когда что-то значимое происходит.
Биты:
Bit 9    CTS:    CTS flag
Описание: Этот бит устанавливается аппаратно в случае, когда мы заметили изменение лог уровня на входе CTS, при условии что этот функционал нами включен, Бит CTSE. Очищается этот бит программно, записью нолика. Может быть настроено прерывание по этому событию, CTSIE=1 в регистре USART_CR3.
0:  Не замечено изменение лог уровня на входе CTS.
1:  Замечено изменение лог уровня на входе CTS.

Bit 8    LBD:    LIN break detection flag
Описание: 
Этот бит устанавливается аппаратно в случае, когда мы работая в режиме LIN обнаружили Break фрейм(это особый тип посылки выглядящий как огромный ноль). Очищается этот бит программно, записью нолика. Может быть настроено прерывание по этому событию, LBDIE=1 в регистре USART_CR2. 
0:  Не обнаружили Break
1:  Обнаружили Break

Bit 7    TXE:    Transmit data register empty
Описание: 
Этот бит устанавливается аппаратно в случае, когда регистр на отправку TDR опустел из-за того что его содержимое было перемещено в сдвиговый регистр. Очищается аппаратно путем записи значения в регистр USART_DR. Может быть настроено прерывание по этому событию, TXEIE=1 в регистре USART_CR1. 
0:  Данные не перемещены в сдвиговый регистр
1:  Данные перемещены в сдвиговый регистр

Bit 6    TС:    Transmission complete
Описание: 
Этот бит устанавливается аппаратно в случае, когда передача значения из сдвигового регистра закончилась, также должен быть установлен разрешающий бит TXE=1. . Может быть настроено прерывание по этому событию, TCIE=1 в регистре USART_CR1. Очищается этот бит программно, записью нолика
0:  Данные не отправлены
1:  Данные отправлены

Bit 5    RXNE:    Read data register not empty
Описание: 
Этот бит устанавливается аппаратно в случае, когда значение из сдвигового регистра перемещено в USART_DR. Очищается этот флаг чтением регистра USART_DR или также можно очистить записью нолика. Может быть настроено прерывание по этому событию, RXNEIE=1 в регистре USART_CR1. 
0:  Данные не перемещены в регистр USART_DR
1:  Данные перемещены в регистр USART_DR

Bit 4    IDLE:    IDLE line detected
Описание: 
Этот бит устанавливается аппаратно в случае, когда мы зафиксировали состоянии линии idle – (значит линия свободна, за время фрейма ничего не передавалось). Может быть настроено прерывание по этому событию, IDLEIE=1 в регистре USART_CR1. Очищается этот флаг следующей последовательностью – чтением регистра USART_SR потом читаем USART_DR.
0:  Не было замечено idle состояния линии
1:  Было замечено idle состояния линии

Bit 3    ORE:    Overrun error
Описание: 
Этот бит устанавливается аппаратно в случае, когда значение прочитано в сдвиговый регистр, а в регистре данных есть данные, поэтому это потенциально опасная ситуация, ведь если мы получим еще байт до того как освободим регистр данных USART_DR, то данные в сдвиговом регистре затрутся.  Может быть настроено прерывание по этому событию, RXNEIE=1 в регистре USART_CR1. Очищается этот флаг следующей последовательностью – чтением регистра USART_SR потом читаем USART_DR.
0:  Нет описанной ситуации
1:  Произошла описанная ситуация

Bit 2    NE:    Noise error flag
Описание: 
Этот бит устанавливается аппаратно в случае, когда выявлен шум на линии приема данных во время получения фрейма. Очищается этот флаг следующей последовательностью – чтением регистра USART_SR потом читаем USART_DR.
0:  Не найдено шума
1:  Найден шум

Bit 1    FE:    Framing error
Описание: 
Этот бит устанавливается аппаратно в случае, когда выявлена рассинхронизация, возможная по ряду причин. Другими словами это означает, что мы не можем верить данным в регистре принятых данных. Очищается этот флаг следующей последовательностью – чтением регистра USART_SR потом читаем USART_DR.
0:  Нет ошибки фрейма
1:  Выявлена ошибка фрейма

Bit 0    PE:    Parity error
Описание: 
Этот бит устанавливается аппаратно в случае, когда выявлено несоответствие бита паритета и количества единиц в передаваемых битах.  Очищается этот флаг следующей последовательностью – чтением регистра USART_SR потом читаем USART_DR. Программа пользователя должна учесть, что надо сначала дождаться установки бита RXNE до того как очищать бит PE. Может быть настроено прерывание по этому событию, PEIE=1 в регистре USART_CR1.
0:  Нет ошибки паритета
1:  Выявлена ошибка паритета

USART_DR [неопределенно]USART_DRОписание: Регистр данных.
Биты:
Bits 8:0    DR[8:0]:    Data value
Описание: Это регистр данных, который на самом деле является двумя регистрами. Просто операции записи и чтения происходят над разными регистрами. Такой подход удобен, ведь теперь мы можем использовать одно имя регистра записывая данные на отправку и читать полученные данные.

USART_BRR  [0x0000]USART_BRRОписание: Регистр определяющий скорость приемопередатчика Baud rate.
Биты:
Bits 15:4    DIV_Mantissa[11:0]:    mantissa of USARTDIV
Описание: Это целая часть числа.

Bits 3:0    DIV_Fraction[3:0]:    fraction of USARTDIV
Описание: Это дробная часть числа.

Берем формулу : USARTDIV  =  (F / BAUD  )
Значит хотим скорость 9600 , а частота шины, на которой стоит USART допустим 12 MGz.
USARTDIV  =  (F / BAUD  )  =  ( 12 000 000/ 9600  )  =  1250  == ox4E2
Кладем это число как есть в регистр USART_BRR , то есть получится DIV_Mantissa = 0x4E  , а  в DIV_Fraction = 0×2

** Глядя в даташит можно себя запутать, и я не совсем уверен что именно так формируется число для генерирования определенной скорости, но на момент, когда будет видео по этой статье я проверю при помощи осциллографа, какие скорости получаются при различных числах в DIV_Mantissa и DIV_Fraction

USART_CR1  [0x0000]USART_CR1Описание: Регистр конфигурационный под номером один, состоящий из различных битов – настройки, которые нужно установить для достижения определенного режима работы модуля USART.
Биты:
Bit 13    UE:    USART enable
Описание: Этот бит включения выключения нашего модуля. Этот бит очищается и устанавливается программно.
0:  Выключаем.
1:  Включаем.

Bit 12    M:    Word length
Описание: 
Этот бит определяет количество данных в фрейме. Этот бит очищается и устанавливается программно. 
0:  8 бит данных
1:  9 бит данных

Bit 11    WAKE:    Wakeup method
Описание: 
Этот бит определяет каким образом мы хотим переходить из режима игнорирования фреймов в нормальный режим приема данных. Этот бит очищается и устанавливается программно. 
0:  По обнаружению idle состояния на линии
1:  По обнаружению своего адреса (случай сети из USART)

Bit 10    PCE:    Parity control enable
Описание: 
Этот бит определяет добавляем мы или нет бит паритета в фрейм, причем это актуально как для передатчика, так и для приемника. Этот бит очищается и устанавливается программно. 
0:  Нет бита паритета
1:  Есть бит паритета

Bit 9    PS:    Parity selection
Описание: 
Этот бит определяет какой именно тип паритета мы выбрали для  фрейма, естественно имеет смысл если мы добавили паритет в фрейм. Этот бит очищается и устанавливается программно. 
0:  Even – Контроль на четность
1:  Odd –  Контроль на не четность

Bit 8    PEIE:    PE interrupt enable
Описание: 
Этот бит разрешения прерывания, когда бит PE=1, что говорит об ошибке паритета. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 7    TXEIE:    TXE interrupt enable
Описание: 
Этот бит разрешения прерывания, когда бит TXE=1, что говорит о  том, что регистр данных пуст так как его содержимое было перемещено в сдвиговый регистр для отправки. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 6    TCIE:    Transmission complete interrupt enable
Описание: 
Этот бит разрешения прерывания, когда бит TC=1, что говорит о  том, что сдвиговый регистр пуст, что означает окончание передачи данных. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 5    RXNEIE:    RXNE interrupt enable
Описание: 
Этот бит разрешения прерывания, когда бит ORE=1  или  RXNE=1, что говорит о  том, что нам пришли данные и надо их читать из регистра данных. Либо просто пришли данные либо данные мы забыли вычитать, а нам начинают передавать ещё. Два варианта причины, но решение одно, поэтому одно прерывание. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 4    IDLEIE:    IDLE interrupt enable
Описание: 
Этот бит разрешения прерывания, когда бит IDLE=1, что говорит о  том, что мы обнаружили idle состояние линии. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 3    TE:    Transmitter enable
Описание: 
Этот бит разрешения работы передатчика, Tx. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 2    RE:    Receiver enable
Описание: 
Этот бит разрешения работы приемника, Rx. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 1    RWU:    Receiver wakeup
Описание: 
Этот бит весьма хитрый. Он означает в каком режиме находится наш USART из двух возможных. Есть обычный режим работы, а другой режим позволяет игнорировать данные на линии. Этот бит может быть изменен аппаратно нашим модулем в определенном режиме работы. Это полезно когда мы хотим сделать сеть из USART устройств. Также изменять этот бит можно программно. 
0:  active mode – Обычный режим
1:  mute mode – Режим игнорирования

Bit 0    SBK:    Send break
Описание: 
Этот бит используется для отправки break фрейма. Этот бит очищается и устанавливается программно. 
0:  Не отправлять
1:  Отправить

 

USART_CR2  [0x0000]USART_CR2Описание: Регистр конфигурационный под номером два, состоящий из различных битов – настройки, которые нужно установить для достижения определенного режима работы модуля USART.
Биты:
Bit 14    LINEN:    LIN mode enable
Описание: Этот бит включения выключения режима LIN. Этот бит очищается и устанавливается программно.
0:  Выключаем.

1:  Включаем.

Bit 13:12    STOP:    STOP bits
Описание: 
Эти биты определяют количество стоп битов в фрейме. Эти биты очищаются и устанавливаются программно. 
00: 1 Stop bit
01: 0.5 Stop bit
10: 2 Stop bits
11: 1.5 Stop bit

Bit 11    CLKEN:    Clock enable
Описание: 
Этот бит включения ножки синхронизации CK. Этот бит очищается и устанавливается программно. 
0:  Отключить ножку CK
1:  Включить ножку CK

Bit 10    CPOL:    Clock polarity
Описание: 
Этот бит определяет полярность линии CK в синхронном режиме работы USART. Это один из двух бит, которые определяют поведение линии CK. Этот бит очищается и устанавливается программно. 
0:  Свободное состояние линии это ноль
1:  Свободное состояние линии это единица

Bit 9    CPHA:    Clock phase
Описание: 
Этот бит определяет полярность линии CK в синхронном режиме работы USART. Это один из двух бит, которые определяют поведение линии CK. Этот бит очищается и устанавливается программно. 
0:  Свободное состояние линии это ноль
1:  Свободное состояние линии это единица

Bit 8    LBCL:    Last bit clock pulse
Описание: 
Этот бит определяет нужен ли последний импульс синхронизации  в синхронном режиме работы USART. Этот бит очищается и устанавливается программно. 
0:  Не делать 
1:  Делать

Bit 6    LBDIE:    LIN break detection interrupt enable
Описание: 
Этот бит разрешения прерывания, когда бит LBD=1, что говорит о  том, что мы обнаружили break фрейм. Это актуально для работы в режиме LIN. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 5    LBDL:    lin break detection length
Описание: 
Этот бит определяет длину сигнала break  в режиме работы LIN. Этот бит очищается и устанавливается программно. 
0: 10 bit break detection — 10 Бит
1: 11 bit break detection  –  11 Бит

Bit 3:0    ADD[3:0]:    Address of the USART node
Описание: 
Этот набор бит определяет адрес нашего устройства, это используется в определенном формате использования нашего модуля для создания сети. Этот адрес используется мастером для общения с конкретным рабом. Этот бит очищается и устанавливается программно. 

 

USART_CR3  [0x0000]USART_CR3Описание: Регистр конфигурационный под номером три, состоящий из различных битов – настройки, которые нужно установить для достижения определенного режима работы модуля USART.
Биты:
Bit 10    CTSIE:    CTS interrupt enable
Описание: Этот бит разрешения прерывания, когда бит CTS=1, что говорит о  том, что мы заметили изменение лог уровня на входе CTS. Этот бит очищается и устанавливается программно.
0:  Запретить
1:  Разрешить

Bit 9    CTSE:    CTS enable
Описание: 
Этот бит разрешает или запрещает работу функционала ножки CTS, другими словами это означает что наш блок USART берет под контроль вход CTS или нет. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 8    RTSE:    RTS enable
Описание: 
Этот бит разрешает или запрещает работу функционала ножки RTS, другими словами это означает что наш блок USART берет под контроль вход RTS или нет. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 7    DMAT:    DMA enable transmitter
Описание: 
Этот бит разрешает или запрещает работу функционала DMA по отношению к нашему USART блоку [ разрешение передачи ]. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 6    DMAR:    DMA enable receiver
Описание: 
Этот бит разрешает или запрещает работу функционала DMA по отношению к нашему USART блоку [ разрешение приема ]. Этот бит очищается и устанавливается программно. 
0:  Запретить
1:  Разрешить

Bit 5    SCEN:    Smartcard mode enable
Описание: 
Этот бит разрешает или запрещает работу функционала Smartcard. Этот бит очищается и устанавливается программно.
0:  Запретить
1:  Разрешить

Bit 4    NACK:    Smartcard NACK enable
Описание: 
Этот бит разрешает или запрещает передачи ошибки паритета для Smartcard. Этот бит очищается и устанавливается программно.
0:  Запретить
1:  Разрешить

Bit 3    HDSEL:    Half-duplex selection
Описание: 
Этот бит разрешает или запрещает работу в режиме полу дуплекса. Этот бит очищается и устанавливается программно.
0:  Запретить
1:  Разрешить

Bit 2    IRLP:    IrDA low-power
Описание: 
Этот бит определяет режим работы irDA, этот бит актуален, если собственно этот вариант конфигурации USART используется. Этот бит очищается и устанавливается программно.
0: Normal mode  – Нормальный режим
1: Low-power mode — Режим пониженного потребления

Bit 1    IREN:    IrDA mode enable
Описание: 
Этот бит разрешает или запрещает работу в режиме irDA. Этот бит очищается и устанавливается программно.
0:  Запретить
1:  Разрешить

Bit 0    EIE:   Error interrupt enable
Описание: 
Этот бит разрешает или запрещает прерывания в случае выявления ошибки фрейма == ( FE , ORE , NE ). Этот бит очищается и устанавливается программно.
0:  Запретить
1:  Разрешить

 

USART_GTPR  [0x0000]USART_GTPRОписание: Регистр дополнительных настроек для режимов работы Smartcard  и  irDA.
Биты:
Bits 15:8    GT[7:0]:    Guard time value
Описание: Этот что-то зачем-то для Smartcard.

Bits 7:0    PSC[7:0]:    Prescaler value
Описание: Этот что-то зачем-то для irDa.



(Borland C++Builder 6) [Статья 13] (TxRxV1)(TestUse)(AVR)(uart)(Tx/Rx)(C/C++)

(Borland C++Builder 6) [Статья 13] (TxRxV1)(TestUse)(AVR)(uart)(Tx/Rx)(C/C++)

 

 

Описание :
Вот и настал замечательный момент, когда можно посмотреть результат трудов блока (TxRxV1). Результатом наших стараний стал проект пакетной передачи данных между ПК и AVR. Нас ждет еще статья про подключение STM32 микроконтроллера. У нас есть пакет, в которых мы можем отправлять инструкции в наш МК. 

В нашем примере мы решили рассмотреть довольно общую ситуацию, представленную в виде управления МК на самом низком уровне. Это означает что мы захотели власть управлять и опрашивать значения в регистрах МК. Таким образом мы можем делать с микроконтроллером почти все, что душе угодно. Тут кроется также проблема скорости выполнения каких либо больших операций, завязанных на большом объеме операций с регистрами. Эту проблему легко решить добавив большие команды, сняв тем самым нагрузку с канала связи и ПО на ПК. Например команда на получение зачения со всех каналов ADC.

Зачем все это ?
Перед нами база, базис, движок, основа или еще что-то, что может быть неплохим универсальным фундаментом для построения приложений основанных на связи ПК и МК. Теперь у нас есть власть делать какие угодно команды для МК, которые могут быть различной длинны и сложности. Мы не зависим от архитектуры МК, единственное что требуется в нашем случае это UART (Универсальный асинхронный приема-передатчик).

Статьи в помощь :
Подключение avr микроконтроллера к компьютеру(FT232RL)
AVR микроконтроллеры для начинающих (урок 12) UART/USART в avr
Подключение avr микроконтроллера к компьютеру
Уроки (C/C++) в Builder6

Это часть цикла взаимосвязанных статей TxRxV1:
1) (Borland C++Builder 6) [Статья 6] (TxRxV1)(SLIP)(ESC)(ESC)(Обмен)(Протокол)(C/C++)
2) (Borland C++Builder 6) [Статья 7] (TxRxV1)(FTDI)(ftd2xx)(FT_Write)(FT_Read)(Обмен)(C/C++)
3) (Borland C++Builder 6) [Статья 8] (TxRxV1)(CRC)(Контрольная сумма)(Обмен)(C/C++) 
4) (Borland C++Builder 6) [Статья 9] (TxRxV1)(Канал)(Протокол)(Связь)(Обмен)(C/C++) 
5) (Borland C++Builder 6) [Статья 10] (TxRxV1)(FILE)(Process)(Tread)(stdio)(C/C++)
6) (Borland C++Builder 6) [Статья 11] (TxRxV1)(Driver)(Поток)(Параллелизм)(stdio)(C/C++) 
7) (Borland C++Builder 6) [Статья 12] (TxRxV1)(Buf)(FIFO)(LIFO)(Pocket)(C/C++)
8) (Borland C++Builder 6) [Статья 13] (TxRxV1)(TestUse)(AVR)(uart)(Tx/Rx)(C/C++)
9) (Borland C++Builder 6) [Статья 14] (TxRxV1)(TestUse)(STM32)(uart)(Tx/Rx)(C/C++)

Ссылки на комплектующие:
Микроконтроллер: ATmega32 (ссылка)
Микроконтроллер: STM32
(ссылка)
Мини перемычка: (ссылка)
Микросхема преобразователь: FT232RL (ссылка)

Модуль из статьи:  (ссылка)
Кабель для подключения модуля: (ссылка)

Проект (TxRxV1)(TestUse)(AVR)(uart) (ссылка на скачивание)

Файл  TxRxV1_MEGA32.h

Файл  TxRxV1_MEGA32.cpp

Файл  progect.cpp

(Обзор радиотоваров) [Статья 1] Рабочее место

(Обзор радиотоваров) [Статья 1] Рабочее место

 

 

Описание :
Эта статья является обзором моего домашнего рабочего места. Рабочее место на данный момент состоит только из компьютера, что может вызвать недоумение)). Зачем делать обзор ПК причем ниже среднего по сегодняшним меркам? Дело в том что хочется немножко поговорить о плюсах и минусах работы на нескольких мониторах, подключенных к одному ПК. Просто хочу поделиться своим опытом и ощущениями от использования 4-ех мониторов и что примечательно различной диагонали.
Мой путь к ПК с четырьмя мониторами был таким, что сначала  мне хватала ноутбука с диагональю 17, потом мне становилось все не удобней и неудобней работать, так как  появилась постоянная необходимость  работать с массой даташитов для решения какой-либо текущей  задачи. Важно заметить, что я не ощущал особой необходимости в еще одном мониторе так как был почему-то уверен, что все так работают и пути другого нет кроме как постоянно жать альт таб. Через некоторое время мне на глаза попался на глаза монитор от старого ПК, который собирал пыль в кладовке. Меня как молнией прошибло, в этом мониторе я увидел решение своих проблем, очень глупо себя чувствовал от того, что как то работал мучился и даже не задумывался как можно сделать свой рабочий процесс проще и удобней.
Теперь у меня был ноутбук и подключенный к нему монитор 19, такую систему можно увидеть в уроках по AVR. Нужно сказать, что мне  было совершенно достаточно двух мониторов, но тут уже вкрадывалась мысль о том, что мне в свое время и одного монитора было больше чем достаточно, что если я сам не осознавая мучаюсь))) и работу которую я делаю, используя два монитора можно сделать быстрее и удобнее на большем числе мониторов.
Удобным поводом поменять устоявшийся порядок рабочего место, стала поломка компьютера брата. Этот факт с подвигнул меня на мысль о покупке нового ПК, а ноутбук отдать ему.

Начался интернет серфинг в поисках ответа на вопрос, как сделать рабочее место с 4-мя мониторами, подключенными к одному ПК. Вопросы были типа, как подключить 4-е монитора к ПК и как выбрать видеокарту для этих мониторов. Долго думал, что дешевле и практичней было бы купить две видеокарты и объединить их с целью увеличения  числа разъемов для подключения мониторов. От этой мысли я отказался видя большое количество видеокарт с 4-мя разъемами, что привело к мысли зачем две, если одной достаточно, а с подключением двух могут возникнуть  проблемы типа не помещаются в корпус или факт, что они должны быть одинаковыми и поддерживать режим объединения, работать в сумме как одна.

Денег в карманах было не много, а еще плюс доллар скаканул, что привело меня на курс покупки ПК с рук. Я приведу конфигурацию ПК на сайте, который я купил без видеокарты, так как там стояла не подходящая мне по разъемам. Интересный факт состоит в том, что один из моих купленных мониторов, к слову, тоже купленный с рук, стоит чуть больше чем компьютер без видеокарты. Видеокарту я купил новую, которая оказалась, что не странно, по цене чуть дороже купленного ПК с рук. Этот факт меня немного расстраивал, но что делать, если курс доллара не шутит.

Как можно заметить по ходу рассказа у меня был новый для меня ПК, купленный с рук, плюс новая видеокарта. Теперь пришло время подумать о мониторах. Один уже есть и долго думал купить другой но он так удачно занял место на столе, что менять его не казалось резонным. Тут я в хронологии пропустил момент покупки нового стола. Дело в том что 4-е монитора это не шутки и стол должен быть соответствующий. Купил большой угловой офисный стол, заказывал в магазине своего города и ждал его недели две. Выбрать его было просто в виду того, что так сложилось, что на работе я сижу за таким же и просто узнал откуда он был заказан, а мебельный города имел возможность заказать этот стол и мне его продать.

Монитор у меня один, так как ноутбук переехал к брату. Теперь пошёл процесс выбора мониторов, который закончился тем что мне нужна большая диагональ и низкая цена. Такой запрос опять вернул меня на бу рынок на котором увидел предложение о распродаже мониторов 27. Цена штуки была больше чем новая видеокарта)))), но они мне показались очень подходящими для меня и поэтому я купил себе два. Дело в том что мне друг продал монитор с рук 21 за маленькую сумму.

ИТОГ:
Теперь у меня 4-е монитора (27 , 27 , 21 ,19). Может показаться, что если работать на нескольких мониторах, то они должны быть одинаковы. Дело в том, что это может быть действительно удобней, но не является критичным, если вы их используете в схожей со мной манере, а именно не для игр. Нужно отметить что мне заметно, что процессор не особо бодро тянет некоторые режимы моей рабочей деятельности, в виде компиляции и разводки в соответствующих САПР, но это не критично, но иногда на досуге думаю как было бы веселей.

Состав рабочего места :

Стол : http://www.yantarmebel.ru/
Офисная мебель -> Форум -> Стол с изгибом (большой. цвет яблоня)

Мониторы :
(17) [SAMSUNG] SyncMaster 913n
(21) [SAMSUNG] SencMaster S20B300
(27) [ProLite] XB2780HSU

ПК :
Материнская плата:     GIGABYTE GA-970A-DS3
Процессор:                       AMD FX-6200 либо FX-6300 Socket AM3 6 ядер

Оперативная память:  DDR3 8 GB Kingston pc-12800 1600MHz
Жёсткий диск:                1TB Seagate Barracuda 7200.12 

Блок питания:               Chieftec 550W
Корпус:                            3Cott

Видеокарта:
GIGABYTE GeForce GTX 750 Ti 1033Mhz PCI-E 3.0 2048M

Нет лишних денег (в ожидании роста курса рубля) :

Источник бесперебойного питания :
Back-UPS 650

Лабораторный источник питания :
MATRIX DPS-3203TK-3

Настольный осциллограф :
DSO-5202BM

(Borland C++Builder 6) [Статья 12] (TxRxV1)(Buf)(FIFO)(LIFO)(Pocket)(C/C++)

(Borland C++Builder 6) [Статья 12] (TxRxV1)(Buf)(FIFO)(LIFO)(Pocket)(C/C++)

 

 

Описание :
Наша статья является надстройкой над ранее уже созданным модулем. Как-то раз мы уже вели разговор о распространенных вариантах хранения данных в памяти, я имею в виду рассказ о концепциях последовательного доступа. Мы разобрались с двумя вариантами LIFO и FIFO, где работали с байтами и нас все устраивало. Теперь мы хотим немного увеличить атомарные кусочки информации для последующего использования, ведь работать с отдельными байтами не всегда удобно и как бы хорошо было, имей мы мешок который хранить может пакеты. Этим мы и займемся, поставив себе целью сделать удобный алгоритм хранения данных в виде пакетов различной длинны, сохраняя концепцию последовательного доступа. Другими словами хотим набор функций типа положить пакет в мешок и функцию вытащить пакет из мешка. Напомню что в нашем подходе вытащить значит больше не хранить его в мешке. 

Статьи в помощь :
Уроки (C/C++) в Builder6
(Borland C++Builder 6) [Статья 4] (FIFO)(LIFO)(BUF)(Буфер)(Память)(C/C++)

Это часть цикла взаимосвязанных статей TxRxV1:
1) (Borland C++Builder 6) [Статья 6] (TxRxV1)(SLIP)(ESC)(ESC)(Обмен)(Протокол)(C/C++)
2) (Borland C++Builder 6) [Статья 7] (TxRxV1)(FTDI)(ftd2xx)(FT_Write)(FT_Read)(Обмен)(C/C++)
3) (Borland C++Builder 6) [Статья 8] (TxRxV1)(CRC)(Контрольная сумма)(Обмен)(C/C++) 
4) (Borland C++Builder 6) [Статья 9] (TxRxV1)(Канал)(Протокол)(Связь)(Обмен)(C/C++) 
5) (Borland C++Builder 6) [Статья 10] (TxRxV1)(FILE)(Process)(Tread)(stdio)(C/C++)
6) (Borland C++Builder 6) [Статья 11] (TxRxV1)(Driver)(Поток)(Параллелизм)(stdio)(C/C++) 
7) (Borland C++Builder 6) [Статья 12] (TxRxV1)(Buf)(FIFO)(LIFO)(Pocket)(C/C++)
8) (Borland C++Builder 6) [Статья 13] (TxRxV1)(TestUse)(AVR)(uart)(Tx/Rx)(C/C++)
9) (Borland C++Builder 6) [Статья 14] (TxRxV1)(TestUse)(STM32)(uart)(Tx/Rx)(C/C++)

Библиотека DAH_BUF_izi.h (ссылка на скачивание)

DAH_BUF_izi.h

DAH_BUF_izi.cpp

(Borland C++Builder 6) [Статья 11] (TxRxV1)(Driver)(Поток)(Параллелизм)(stdio)(C/C++)

(Borland C++Builder 6) [Статья 11] (TxRxV1)(Driver)(Поток)(Параллелизм)(stdio)(C/C++)

 

 

Описание :
Мы можем сделать алгоритм получения и отправки пакетов немного другим. Раньше уже была представлена библиотека (DAH_KanalLib_V1.h), позволяющая отправлять и принимать пакеты. Эта библиотека имеет все что нужно для информационного обмена с подключенным устройством, но мы попробуем немного поменять концепцию работы с пакетами данных. Наше изменение приведет к тому, что мы избавимся от ф-ии приема пакета, а именно, заменим принцип приема пакетов на событие (event), нами созданного класса.

Такое изменение может как упростить, так и усложнить нам жизнь. Все зависит от специфики решаемой задачи, поэтому такое изменение может быть излишним. Для того что бы сделать в своем классе(event), мы постоянно опрашиваем нашу микросхему и пытаемся найти пакет, если пакет нашелся то вызывается  обработчик события по приему пакета, тело которого описал пользователя и передал на него указатель в наш класс.

Для упрощения маштабирования проекта можно скрыть аспекты реализации некоторых алгоритмов. Такой подход также может иметь цель защитить интеллектуальную собственность разработчика, предоставляющего пользователю функции в виде прототипов и описания, но без описания реализации этих функций(.с/.cpp). Мы можем все скрыть, засунув все файлы в библиотеку(.lib), как это сделать показано в видео к статье.

Статьи в помощь :
Уроки (C/C++) в Builder6

Это часть цикла взаимосвязанных статей TxRxV1:
1) (Borland C++Builder 6) [Статья 6] (TxRxV1)(SLIP)(ESC)(ESC)(Обмен)(Протокол)(C/C++)
2) (Borland C++Builder 6) [Статья 7] (TxRxV1)(FTDI)(ftd2xx)(FT_Write)(FT_Read)(Обмен)(C/C++)
3) (Borland C++Builder 6) [Статья 8] (TxRxV1)(CRC)(Контрольная сумма)(Обмен)(C/C++) 
4) (Borland C++Builder 6) [Статья 9] (TxRxV1)(Канал)(Протокол)(Связь)(Обмен)(C/C++) 
5) (Borland C++Builder 6) [Статья 10] (TxRxV1)(FILE)(Process)(Tread)(stdio)(C/C++)
6) (Borland C++Builder 6) [Статья 11] (TxRxV1)(Driver)(Поток)(Параллелизм)(stdio)(C/C++) 
7) (Borland C++Builder 6) [Статья 12] (TxRxV1)(Buf)(FIFO)(LIFO)(Pocket)(C/C++)
8) (Borland C++Builder 6) [Статья 13] (TxRxV1)(TestUse)(AVR)(uart)(Tx/Rx)(C/C++)
9) (Borland C++Builder 6) [Статья 14] (TxRxV1)(TestUse)(STM32)(uart)(Tx/Rx)(C/C++)

Библиотека DAH_DriverV1.h (ссылка на скачивание)

DAH_DriverV1.h

DAH_DriverV1.cpp

(Borland C++Builder 6) [Статья 10] (TxRxV1)(FILE)(Process)(Tread)(stdio)(C/C++)

(Borland C++Builder 6) [Статья 10] (TxRxV1)(FILE)(Process)(Tread)(stdio)(C/C++)

 

 

Описание :
В общем виде представленная мной библиотека содержит ф-ии упрощенной работы с файлами на ПК. Такое упрощение влияет на производительность, но в рамках малого использования файлов на ПК упрощение работы с ними приводит к увеличению скорости проектирования приложений. В мои обыденные задачи при создании приложения используемого файлы на ПК, это перекодировка файлов, чтение из файла и отправка его в какое-либо устройство или наоборот чтение информации из устройства в файл. При таких скудных задачах при работе с файлами было решено упростить себе жизнь и создать модуль (библиотеку) заточенную на удобство использования.

Дополнительной особенностью нашего модуля (библиотеки) является запуск процесса или потока. Эта тема не раскрыта и находится в зачаточном состоянии, но поставленные задачи исполняет. Запуск процесса это удобный способ писать раскодировщик отдельным приложением и запускать его из основного приложения, такой подход упрощает общую структуру проекта. Часто при работе с различными программируемыми микросхемами производитель предоставляет различные утилиты для удобства работы с выходными файлами САПР, поэтому знание как запустить утилиту производителя это весомое знание. В нашем варианте библиотеки такой роскоши нет, но как только объявлю проект где это будет нужно предоставлю пример как удобно это реализовать. Так сделано ввиду того, что приходится модернизировать свои модули подстраивая их под свои текущие нужды и на момент среза для создания проекта для сайта (TxRxV1) нужды в запуске какой-либо утилиты не было, но решено было немного пролить свет на эту интересную тему.

Второй вишенкой на торте является запуск процесса. Это весьма ценное знание при создании приложений для которых не подходит модель последовательного исполнения инструкций (кода). Порожденный поток в нашем приложении должен восприниматься как еше один своеобразный main в нашем приложении. Дело в том что, создав еще один поток, приложение раздваивается и начинает выполнятся параллельно или  якобы параллельно. Это налагает большую ответственность на разработчика, который должен следить за тем чтобы потоки не конфликтовали между собой при общении (обращении к одним и тем же данным).

Для работы с файлами на ПК  была использована библиотека <stdio.h>
stdio.h :  (от англ. standard input/output header — стандартный заголовочный файл ввода-вывода) заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода. Функциональность унаследована от «портативного пакета ввода-вывода» («portable I/O package»), написанного Майком Леском из Bell Labs в начале 1970-х.[1]C++ ради совместимости также использует stdio.h наряду со схожим по функциональности заголовочным файлом cstdio.
Функции, объявленные в stdio.h, являются весьма популярными благодаря тому, что, являясь частью Стандартной библиотеки языка Си, они гарантируют работу на любой платформе, поддерживающей Си. Приложения на отдельных платформах могут, тем не менее, иметь причины для использования функций ввода-вывода самой платформы вместо функций stdio.h.
Стандарт определяет такое понятие, как поток — последовательный набор информации, который может быть входным или выходным, может быть предоставлен как файлом, так и устройством (например, терминалом)[2]. Поток может быть текстовым или бинарным. Текстовый поток — последовательность символов. При этом термин «символ» в данном контексте может означать как читаемый символ, так и управляющий символ (например, символ вертикальной табуляции или символ конца файла). Символы в текстовом потоке объединяются в строки. Каждая строка заканчивается символом новой строки либо символом конца файла. Бинарный поток — последовательность байтов, которые могут прозрачно представлять любую информацию (в том числе и текст). Поток может быть в одном из трёх состояний: неориентированном (по умолчанию), «широко символьном» или битовым. Состояние определяется последней функцией, которая использовала этот поток.

Работа с процессами и потоками большая тема, которой мы слегка касаемся в данной статье.
Проце́сс — программа, которая выполняется в текущий момент. Стандарт ISO 9000:2000 определяет процесс как совокупность взаимосвязанных и взаимодействующих действий, преобразующих входящие данные в исходящие.
Компьютерная программа сама по себе — это только пассивная совокупность инструкций, в то время как процесс — это непосредственное выполнение этих инструкций.
Также, процессом называют выполняющуюся программу и все её элементы: адресное пространство, глобальные переменные, регистры, стек, открытыефайлы и т. д.

Пото́к выполне́ния (тред; от англ. thread — нить) — наименьшая единица обработки, исполнение которой может быть назначено ядром операционной системы. Реализация потоков выполнения и процессов в разных операционных системах отличается друг от друга, но в большинстве случаев поток выполнения находится внутри процесса. Несколько потоков выполнения могут существовать в рамках одного и того же процесса и совместно использовать ресурсы, такие как память, тогда как процессы не разделяют этих ресурсов. В частности, потоки выполнения разделяют инструкции процесса (его код) и его контекст (значения переменных, которые они имеют в любой момент времени). В качестве аналогии, потоки выполнения процесса можно уподобить нескольким вместе работающим поварам. Все они готовят одно блюдо, читают одну и ту же кулинарную книгу с одним и тем же рецептом и следуют его указаниям, причём не обязательно все они читают на одной и той же странице.
На одном процессоре многопоточность обычно происходит путём временного мультиплексирования (как и в случае многозадачности): процессор переключается между разными потоками выполнения. Это переключение контекста обычно происходит достаточно часто, чтобы пользователь воспринимал выполнение потоков или задач как одновременное. В многопроцессорных и многоядерных системах потоки или задачи могут реально выполняться одновременно, при этом каждый процессор или ядро обрабатывает отдельный поток или задачу.

Статьи в помощь :
Уроки (C/C++) в Builder6

Это часть цикла взаимосвязанных статей TxRxV1:
1) (Borland C++Builder 6) [Статья 6] (TxRxV1)(SLIP)(ESC)(ESC)(Обмен)(Протокол)(C/C++)
2) (Borland C++Builder 6) [Статья 7] (TxRxV1)(FTDI)(ftd2xx)(FT_Write)(FT_Read)(Обмен)(C/C++)
3) (Borland C++Builder 6) [Статья 8] (TxRxV1)(CRC)(Контрольная сумма)(Обмен)(C/C++) 
4) (Borland C++Builder 6) [Статья 9] (TxRxV1)(Канал)(Протокол)(Связь)(Обмен)(C/C++) 
5) (Borland C++Builder 6) [Статья 10] (TxRxV1)(FILE)(Process)(Tread)(stdio)(C/C++)
6) (Borland C++Builder 6) [Статья 11] (TxRxV1)(Driver)(Поток)(Параллелизм)(stdio)(C/C++) 
7) (Borland C++Builder 6) [Статья 12] (TxRxV1)(Buf)(FIFO)(LIFO)(Pocket)(C/C++)
8) (Borland C++Builder 6) [Статья 13] (TxRxV1)(TestUse)(AVR)(uart)(Tx/Rx)(C/C++)
9) (Borland C++Builder 6) [Статья 14] (TxRxV1)(TestUse)(STM32)(uart)(Tx/Rx)(C/C++)

Библиотека FILE_izi_V2.h (ссылка на скачивание)

FILE_izi_V2.h