Developer от Бога

DV

четверг, 6 июля 2017 г.

STM32. SPI интерфейс

SPI Самый популярный интерфейс передачи данных, может работать в режиме протокола SPI или аудио протокола I2S. Большинство датчиков, различных сенсоров и дисплеев общаются с микроконтроллером через этот интерфейс. Он несколько сложнее интерфейса USART , но обеспечивает более надежную передачу данных.
Первое чем отличается от интерфейса USART, это назначение "Ведущей" (или Master) микросхемы, которая задает тактирование и управляет приемом/передачей информации между двумя и больше микросхемами. Сколько бы ни было микросхем на связи SPI, обязательно должен быть только один Master (в один момент времени).
SPI работает в режиме приема/передачи формата 8 и 16 бит полудуплекс или полный дуплекс, использует 4 вывода:

MOSI - Master Output Slave Input, если микросхема является Ведущей, этот вывод должен быть подключен к входу Подчиненной микросхемы.
MISO - Master Input Slave Output, если микросхема является Ведущей, этот вывод принимает сигнал от Подчиненной микросхемы ( Ведомого )
SCK - вывод тактирования.
NSS - вывод управления (вкл/выкл) Подчиненных (Slave) микросхем, если ножка не настроена на автоматическое переключение, в начале связи ее уровень нужно устанавливать в ноль или наоборот в единицу, в зависимости от настроек бита.
Бит CPOL и CPHA отвечает за отношение фазы сигнала к тактированию, от него зависит при каком логическом переходе (с 0 в 1 , или наоборот) начнется отчет начала связи. Вариантов есть четыре, кроме отслеживания по переходу есть возможность настройки по переднему и задних фронтах. Эти установки должны быть одинаковы на всех устройствах участвующих в передаче. На качество связи данные биты могут повлиять если графики сигнала тактовых импульсов на фронтах не одинаковы на разных устройствах, и можно выбрать ту модель синхронизации, максимально подходящей для данных устройств.

Сложность работы SPI является еще и в том, что он не может передавать данные " в никуда ", или принимать данные из " неоткуда " как USART. Передача данных SPI начинается с передачи адреса регистра , куда эти данные следует записать или прочитать, и только потом уже отправлять значения в регистры. Поэтому нужно знать адресное пространство других устройств, чтоб с ними работать. Если микросхем много, то прежде всего нужно еще и указывать адрес устройства с которым будет сеанс связи.
Вся работа према-передачи происходит через регистр смещения, с одной стороны из него данные выходят, с другой стороны одновременно, побитово, в него данные загружаются. Главное не перепутать какие данные нужны, а какие просто мусор - загрузились одновременно при отправке данных.


//............SPI.......
#define RCC_SPI1 *((uint32_t*)0x40023844)//RCC
#define SPI1_CR1 *((uint32_t*)0x40013000)
#define SPI1_CR2 *((uint32_t*)0x40013004)
#define SPI1_SR *((uint32_t*)0x40013008)
#define SPI1_DR *((uint32_t*)0x4001300C)
#define SPI1_CRCPR *((uint32_t*)0x40013010)
#define SPI1_RXCRCR *((uint32_t*)0x40013014)
#define SPI1_TXCRCR *((uint32_t*)0x40013018)
#define SPI1_CTRL_REG1 *((uint32_t*)0x40013020)

Комментариев нет:

Отправить комментарий