Управление lis302dl через spi

Aimagin Blogspot – How to Use SPI Communication Port

download all demo files:SPI.7z

1       Using SPI Communication Port

Serial Peripheral Interface or SPI is another form of Serial Synchronous Communication. In this type of communication one device works as Master while another acts as a Salve. Master device initiates the data frame and there can be multiple slave devices.

SPI works in full duplex mode. Signals between Master and Slave can be sent simultaneously. One of the biggest advantage of SPI protocol is that the complete protocol has flexibility for the bits transfer and not limited to 8-bit words.

There can be arbitrary choice of message size content and purpose.

Here are few examples for the devices which uses SPI communication

  • The module that converts analog signals to digital and vice versa;
  • Communication with EEPROM and FLASH memory;
  • Digital clock module with Real Time Clock (RTC);
  • Temperature and pressure sensors;
  • Other equipment such as signal mixer, potentiometer, LCD controller, USART, CAN controller, USB controller amplifier.

Figure 1‑1 shows the connection between SPI Master and Slave. The link have four lines/wires

  • SCLK (Serial Clock) to the clock signal given from Master to the Slave device to set the tempo for data transmission;
  • MOSI (Master Out Slave In) use data from device to device i.e. Master Slave;
  • MISO (Master In Slave Out) is used to receive data from Slave;
  • SS (Slave Select) pin or CS (Chip Select) transmit low signal to the desired Slave devices with which it want to exchange data.

Master device’s function is to control all communications with clock signal and signal line SS. The Master will decide whether to receive or send data into slave device signal line SS (Slave Select) in case of having more than one slave by make signal level of that SS LOW. If we want to connect to particular SS, just set the signal level of that SS to LOW as shown in Figure 1‑2.

Figure 1-2: SPI communication between Master and Slave

When comparing the SPI communication with I2C communication, the former one has higher throughput and is ideal for low speed data communications such as EEPROM memory module or digital clock.

SPI communication has an advantage of full duplex communication that is able to transmit and receive simultaneously for particular cable. Typically SPI has lower power requirements than I2C due to simple hardware interface. Slaves use the master’s clock and do not require precision oscillators. SPI is not limited to any maximum clock speed, enabling potentially high throughput.

1.2   Using SPI Blockset

Waijung Blockset consists of SPI Master Setup Block as shown in Figure 1‑3. To set any Register values related to SPI communications i.e. select SPI module in STM32F4DISCOVERY up to three sets, select pin MOSI/MISO/SS and set frequency of clock signal in SCLK.

Figure 1-3: Characteristics of settings of SPI Master Setup Block

SPI communication has no certain pattern, in order to set communication pattern of Master device to match with Slave we have to do the following things:

  1. Set communication direction, Full Duplex (receive and transmit data in same time) Half Duplex Tx (transmission only), Half Duplex Rx (receive only)
  2. Data receiving and sending format 8 or 16 bit, can select first bit to send either most significant bit (MSB) or lowest significant bit (LSB)
  3. Form of clock signal edge to setting tempo of receiving – sending data. There are 4 types:

Figure 1-4: Data is received or sent when CPOL = 0 and CPHA = 0 0 [1, p. 800]

When the clock polarity is LOW and clock phase 2nd edge (CPOL_Low/CPHA_2Edge), the system will start reading first bit when found second edge of signal (negative edge) as shown in Figure 1‑5.

 Figure 1-5: Data receiving and sending when CPOL = 0 and CPHA = 1 [1, p. 800]

When the clock polarity is HIGH and clock phase 1st edge (CPOL_High/CPHA_1Edge) is at the initial state (clock signal will be in HIGH state), the system will start reading first bit when found first edge of signal (negative edge) as shown in Figure 1‑6

Figure 1-6: Data receiving and sending when CPOL = 1 and CPHA = 0 [1, p. 800]

When the clock polarity is HIGH and Clock phase 2st edge (CPOL_High/CPHA_2Edge), the system will start reading first bit when found second edge of signal (positive edge) as Figure 1‑7

Figure 1-7: Data receiving and sending when CPOL = 1 and CPHA = 1 0 [1, p. 800]

SPI Master Read/Write Block as shown in Figure 1‑8 receives or sends data into slave device by SPI. STM32F4DISCOVERY is used as Master device and user can set number of byte which need to be sent.

Figure 1-8: Properties and setting the values of SPI Master Read/Write Block

2       Example of using DAC with SPI communication

This section describes how to use SPI communication to control devices. This example given below uses IC LTC1661 (from Linear Technology). Signal converter module is used to convert 10 bits to 2 analog channels. Although STM32F4DISCOVERY has 2 DAC channels, users can use this device if they want to add more analog voltage supply channel.

Figure 2-1: IC PINs of LTC1661 [2]

Figure 2‑2 shows the data of LTC1661 through SPI to adjust the voltage. When looking at clock signal pattern, in Idle state, the signal is LOW and reads data bit on MOSI when the positive edge is found (1st edge capture).

One data set has 16 bits containing a digital value. 10 bits are needed to convert the voltage value and 4 bits control code for controlling IC LTC1661 and last two bits are don’t care bits as shown in Figure 2‑3.

Maximum frequency of clock signal that IC LTC1661 can work properly is 16.7 MHz [2, p. 3].

 Figure 2-2: SPI Communication of IC LTC1661 [2, p. 9]

Figure 2-3: Description table of Control Code of IC LTC1661 [2, p. 9]

2.1   Experiment Devices

 Figure 2-4: Installation of signal generator with IC LTC1661

Figure 2‑4 shows connection between STM32F4DISCOVERY and IC LTC1661 on the aMG F4 Connect board having port to connect SPI device by setting PA15 pin as Slave Select (NSS), PB3 pin as SCLK, PB4 pin as MISO and PB5 pin as MOSI.  IC LTC1661 receives data from Master device only. Users just have to connect transmission line for MOSI data.

Table 2-1: Connection between STM32F4DISCOVERY and IC LTC1661

2.2   Experiment to Use IC LTC 1661 on SPI Communication

Objective:

  • User can setup and configure SPI for each device;
  • User can generate electric voltage by IC LTC 1661.

Figure 2-5: Simulink Model to generate one channel analog signal with ICLTC1661

Figure 2‑5 shows Simulink model for creating one channel analog signal with IC LTC1661 through SPI communication.

After downloading the model into STM32F4DISCOVERY, the value of Control Code = 1001 and value from Counter Limited Block will be exported and Counter Limited Block will start counting from 0 to 1023 every 0.1 ms to Slave device for DAC.  After 0.

1 second, the value of Counter will start from 0 again (So the signal frequency is 10 Hz). Figure 2‑6 shows the signal measured from pin 8 (Vout A) of IC LTC1661 using Oscilloscope.

The measurements from Figure 2‑6 shows the signal frequency of 9.766 Hz or has signal period = 0.102 seconds and maximum signal value is around 3.04 V.

Figure 2-6: Experiment result of analog signal generation with IC LTC1661

Figure 2‑7 shows a Simulink Model for constructing two channels of analog signal. Control Code = 10 is used for sending DAC to B channel, and Pulse Generator Block is used for selecting data to send to SPI.

When the value of Pulse Generator Block is 0 and the value of Control Code = 1010, a constant value of 256 will be sent thus VoutB = (259 / 1023) x 3 = 0.826V (can measure by Digital Multimeter). When Pulse Generator Block = 1 and value of Control Code = 1010 and value of Counter will be sent alternatively every 0.05 ms.

Figure 2-7: Simulink Model to generate two channels analog signal with multiplexer technique

3       Reading the Value of Linear Accelerometer LIS302DL

 Nowadays, the use of linear accelerometer has been increased tremendously in smart control systems such as screen adjustment of LCD in smartphones and notebooks, vibration detector, burglar alarm and subsystem of navigational system in unmanned aerial vehicle (UAV).

When we are on earth surface and drop an object to the earth, that object will fall into the ground with constant acceleration known gravitational acceleration (g). The value of g is known to be 9.8 m/s. If we measure an object with 3g acceleration, it means it is travelling with the speed three times than the gravitational acceleration.

3.1   Experiment Devices

This experiment uses STM32F4DISCOVERY as shown in Figure 3‑1 installed with accelerometer LIS302DL developed by STMicroelectronics. Properties of LIS302DL are:

  • Acceleration measuring in X, Y, Z;
  • Selectable full scales of ±2g or ±8g;
  • Send the measured value via serial communication I2C or SPI;
  • Selectable transmission rate 100Hz or

 Figure 3-1: Device installation for reading data from LIS302DL sensor through SPI communication

In order to read data from SPI, user need to read the communication format of LIS302DL from Datasheet [3]. Data reading formats of LIS302DL has two ways to read, one byte (8 bits data) and multiple bytes per time. Number of bytes depends on command. Figure 3‑2 shows the data format of LIS302DL. Master device send the command and address of internal register of LIS302DL.

Figure 3-2: Data reading form of LIS302DL through SPI 1 byte per time [3, p. 22]

Multiple bytes reading can be done by setting M/S = 1 and define the initial start address. Data from LIS302DL will be sent to Master device on the tempo of SCLK signal. When 8 bits are sent already, LIS302DL will send data from next address until the Master device stop data reception.

Figure 3-3: Data reading form of LIS302DL through SPI, multiple bytes (in this example 2 bytes)

Writing data into LIS302DL has two ways too. In Figure 3‑4 and Figure 3‑5 shows data writing to LIS302DL one byte and multiple bytes per time respectively. Master device send writing command and address of internal register of LIS302DL then data is sent to set value in that register.

Figure 3-4: Data writing form of LIS302DL through SPI one byte per time [3, p. 22]

Figure 3-5: Data writing form of LIS302DL through SPI multiple bytes [3, p. 23]

Figure 3‑6 shows the address of internal register of LIS302DL. Each register has different functions, such as controlling the functionality of the sensor, store variable values and store the measured linear acceleration value etc.

Figure 3 6: Address of internal register of LIS302DL [3, p. 24]

Simulink model for reading acceleration values in three axis of LIS302DL sensor is shown in Figure 3‑7. The model in figure below has three main functions:

  • LIS302DL initialize subsystem for setting initial value;
  • LIS302DL read subsystem for reading acceleration value in axis X, Y and Z;
  • UART Tx is for sending acceleration value using UART Tx communication.

Figure 3-7: Simulink Model for reading data from LIS302DL sensor through SPI communication

After downloading model into STM32F4DISCOVERY, the program will read initial state of LIS302DL by subsystem as in Figure 3 8. That is the one byte data reading as SPI from CTRL_REG Register at (Address 0x20). If the read value is not equal to 0xC7, the data is written as SPI at CTRL_REG  Register.

Figure 3-8: Subsystem model for setting up initial value of LIS302DL

 Then LIS302DL Read Subsystem starts to read the acceleration values of the three axis.  All data are in Out_X, Out_Y and Out_Z Register (Address 0x29, 0x2A and 0x2D) respectively.  Figure 3‑9 shows data reading as SPI 6 bytes and set Out_X to be starting address.

Figure 3-9: Subsystem Model for reading acceleration value of three axes from LIS302DL

The read value is int8 type, signed integer 8 bit (value -127 to 127) and display it via UART communication every 0.02 seconds or 50 Hz. Figure 3‑8 shows settings of Full Scale selection (FS) = 0.

That’s means measuring linear acceleration in interval ±2g thus linear acceleration (unit:  g m/s2) can be calculated from equation:Then LIS302DL Read Subsystem starts to read the acceleration values of the three axis.

 All data are in Out_X, Out_Y and Out_Z Register (Address 0x29, 0x2A and 0x2D) respectively.  Figure 3‑9 shows data reading as SPI 6 bytes and set Out_X to be starting address.

Acceleration = 2 x measured value/ 127

When the Z-Axis of sensor is in the line of the gravity, the measured acceleration is 1g or the value = 64

Figure 3‑10 shows linear acceleration via TeraTerm program on STM32F4DISCOVERY. Acceleration value in Z-axis will be maximum because of gravitational acceleration and the value in X-Y axis will be minimum because they are parallel with earth surface.

Figure 3-10: Experimental results of linear acceleration data reading

3.2   Example of Acceleration Detection in case of Crash

When an object is crashed, the acceleration will be changed in short time and we can use the sensor to detect it and bring that value to alarm or control any devices for further processing. For the examples, burglar alarm, vibration detector, safety airbag, etc.

Figure 3‑11 shows Simulink model to display the value of linear acceleration in real time.  This model is working on computer (Don’t need to download into STM32F4DISCOVERY) when connected STM32F4DISCOVERY via USB and press Run icon. This program will read linear acceleration value from STM32F4DISCOVERY through USB cable.

Figure 3‑11: Simulink model to display result of linear acceleration in real time

Note: You should close all serial communication programs before running this model.

Figure 3-12: Devices preparation for experimenting with linear acceleration in real time

After double clicking the Scope Block, graph of linear acceleration in 3 axis will appear in real time, it mean the pattern of graph will change if STM32F4DISCOVERY changes its position as in Figure 3‑13.

Figure 3‑13: Graph of real time linear acceleration measured by LIS302DL

4. References

  1. STMicroelectronics, “RM0090: STM32F40xxx Reference Manual [Online],” 2013.
  2. STMicroelectronic, “LIS302DL MEM motion sensor,” 2008.
  3. Linear Technology, “LTC1661 Micropower Dual 10-Bit DAC in MSOP,” 1999.
  4. K. a. R. Kalinsky, “Introduction to Serial Peripheral Interface,” Embedded.com, UBM Electronics, 2002. [Online]. Available: http://www.embedded.com/electronics-blogs/beginner-s-corner/4023908/Introduction-to-Serial-Peripheral-Interface.
  5. P., “การติดต่อสื่อสารด้วย SPI : Serial Peripheral Interface,” [Online]. Available: http://www.123microcontroller.com/Hardware-Interfacing/SPI-Serial-Peripheral-Interface-communication. [Accessed 27 February 2014].

Источник: http://aimagin.com/blog/how-to-use-spi-communication-port/

Библиотека SPI

Источник: http://atmel.ucoz.ru/publ/lib_spi/1-1-0-250

Accelerometer LIS302DL di STM32F4-Discovery

Compiler yang saya gunakan adalah Coocox IDE dengan library gcc-arm-none-eabi. Untuk mengakses sensor tersebut saya menggunakan beberapa file dari project demo bawaan STM32F4-Discovery yang di build di uVision Keil. Untuk itu, saya mengedit beberapa bagian karena arsitektur programming-nya sedikit berbeda dengan Coocox. Berikut file yang saya gunakan.

USART1_lib.h –> sudah di post sebelumnya lis302dl_lib_ku.h stm32f4_discovery_lis302dl.h –> file demo bawaan STM32F4-Discovery berbasis uVision keil Sedangkan Repository yang dicentang adalah: -C Library -M4 CMSIS Core -CMSIS Boot -RCC -GPIO -EXTI -SPI -I2C -DMA -Flash -TIM -USART -SYSCGF

Lengkapnya sebagai berikut.

#ifndef __LIS302DL_LIB_KU_H #define __LIS302DL_LIB_KU_H #include “stm32f4_discovery_lis302dl.h” #include “stm32f4xx_flash.h” /* Includes ——————————————————————*/ #include /* Exported types ————————————————————*/ /* Exported constants ——————————————————–*/ /* Exported macro ————————————————————*/ /* Exported functions ——————————————————- */ typedef struct { uint8_t acc_x; /* Power-down/Active Mode */ uint8_t acc_y; /* Power-down/Active Mode */ uint8_t acc_z; }acc_data; uint32_t LIS302DL_TIMEOUT_UserCallback(void); void Fail_Handler(void); void Accelerometer_MEMS_Init(void); acc_data Accelerometer_MEMS(void); #endif

 

 

#include “lis302dl_lib_ku.h” #define MEMS_PASSCONDITION 15 /* MEMS Microphone SPI Interface */ #define SPI_SCK_PIN GPIO_Pin_10 #define SPI_SCK_GPIO_PORT GPIOB #define SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOB #define SPI_SCK_SOURCE GPIO_PinSource10 #define SPI_SCK_AF GPIO_AF_SPI2 #define SPI_MOSI_PIN GPIO_Pin_3 #define SPI_MOSI_GPIO_PORT GPIOC #define SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOC #define SPI_MOSI_SOURCE GPIO_PinSource3 #define SPI_MOSI_AF GPIO_AF_SPI2 extern uint8_t Buffer[6]; #define TESTRESULT_ADDRESS 0x080FFFFC #define ALLTEST_PASS 0x00000000 #define ALLTEST_FAIL 0x55555555 #define ABS(x) (x < 0) ? (-x) : x #define MAX(a,b) (a < b) ? (b) : a uint8_t Buffer[6]; void Delay(uint32_t nTime) { nTime *= 8000; while(nTime != 0) { nTime--; } } void Fail_Handler(void) { FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3); FLASH_ProgramWord(TESTRESULT_ADDRESS, ALLTEST_FAIL); while(1) { Delay(5); } } uint8_t DemoEnterCondition = 0x00; uint32_t LIS302DL_TIMEOUT_UserCallback(void) { if (DemoEnterCondition == 0x00) {Fail_Handler(); } else { while (1) { } } return 0; } void Accelerometer_MEMS_Init(void) { LIS302DL_InitTypeDef LIS302DL_InitStruct; LIS302DL_FilterConfigTypeDef LIS302DL_FilterStruct; /* Set configuration of LIS302DL*/ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_X_ENABLE | LIS302DL_Y_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Set configuration of Internal High Pass Filter of LIS302DL*/ LIS302DL_FilterStruct.HighPassFilter_Data_Selection = LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER; LIS302DL_FilterStruct.HighPassFilter_CutOff_Frequency = LIS302DL_HIGHPASSFILTER_LEVEL_1; LIS302DL_FilterStruct.HighPassFilter_Interrupt = LIS302DL_HIGHPASSFILTERINTERRUPT_1_2; LIS302DL_FilterConfig(&LIS302DL_FilterStruct); /* Required delay for the MEMS Accelerometre: Turn-on time = 3/Output data Rate = 3/100 = 30ms */ Delay(80); } acc_data Accelerometer_MEMS(void) { uint8_t temp; uint8_t xdata, ydata = 0; acc_data ukur_data; /* Read WHO_AM_I register */ LIS302DL_Read(&temp, LIS302DL_WHO_AM_I_ADDR, 1); /* Check device identification register, this register should contains the device identifier that for LIS302DL is set to 0x3B */ if (temp != 0x3B) { Fail_Handler(); } LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 6); ukur_data.acc_x = Buffer[0]; ukur_data.acc_y = Buffer[2]; ukur_data.acc_z = Buffer[4]; return(ukur_data); }

 

 

Источник: https://wangready.wordpress.com/2013/06/22/accelerometer-lis302dl-di-stm32f4-discovery/

Статьи

Пирография и дизайн интерьеров – дизайнер Александр Манзуров
Многим пирография знакома с детства, когда ей занимались в «кружках» или просто дома, с родными, выжигая надписи и простые рисунки на дощечках. Но данный вид художественного искусства имеет очень длительную историю… подробнее

Как выбрать светодиодную ленту, чтобы не разочароваться в ней?

Бывает, люди покупают светодиодные ленты разных марок на рынке и после установки обнаруживают, что они светят не так ярко, как должно быть, а со временем теряют яркость еще сильнее, и, в конце концов, возникает необходимость её замены. После таких случаев люди разочаровываются в светодиодных источниках света, но не стоит списывать со счетов абсолютно все марки лент, не разобравшись.

В данной статье мы расскажем, как избежать разочарования и сделать правильный выбор светодиодной ленты, а также опишем преимущества светодиодных лент Arlight перед лентами других производителей.

подробнее

Кратко об управлении освещением с использованием протокола DALI
DALI (Digital Addressable Lighting Interface – Цифровой интерфейс освещения с возможностью адресации) – стандартный цифровой протокол управления освещением. Протокол DALI открытый, доступный всем производителям. подробнее

Управление светодиодными источниками света по протоколам SPI и DMX
Эта статья посвящена особому классу управляемых светодиодных источников света, к которому относятся  пиксельные светодиодные ленты «Бегущий огонь», управляемый «гибкий неон» и флеш-модули. В них, как и в обычных многоцветных RGB лентах и модулях, используются трехцветные светодиоды с красным (Red), зеленым (Green)  и синим (Blue) цветом свечения. подробнее

Всё, что нужно знать при покупке светодиодной ленты.

Сегодня мы расскажем о том, на что обратить внимание при покупке светодиодной ленты, и каковы наши гарантийные обязательства перед Вами. Светодиодные ленты, поставляемые компанией NeonColor, производятся по самым современным технологиям и отвечают высоким стандартам качества.

подробнее

Что такое светодиодная лента?

Светодиодная лента – современный источник света, обладающий многими привлекательными и оригинальными свойствами.

подробнее

Подбор блока питания для светодиодной ленты

Выбор источника питания для светодиодной ленты выполняется по двум её основным параметрам – напряжению питания и общей потребляемой мощности.

подробнее

Основные характеристики светодиодной ленты

Для того чтобы лучше ориентироваться в большом разнообразии современных светодиодных лент необходимо разбираться в её основных характеристиках. Рассмотрим некоторые из них.

подробнее

Монтаж и эксплуатация светодиодной ленты: требования, рекомендации, советы

Светодиодная лента – надежный источник света, который, при соблюдении некоторых несложных рекомендаций, прослужит Вам многие годы. В данной статье мы дадим советы, которые помогут правильно смонтировать светодиодную ленту.

подробнее

Интересное решение для освещения в квартире
Рады представить вам новый проект, выполненный нашими специалистами. Московская квартира, сочетающая в своём интерьере домашний уют и строгую графичность.

Светлая прихожая встречает нас и провожает в главную комнату – гостиную. Освещение прихожей включает в себя точечные светильники, закарнизную подсветку по всему периметру помещения и несколько бра.

Матовая стеклянная поверхность шкафа-купе выгодно отражает освещение и приобретает богатый золотисто-бронзовый оттенок подробнее

Источник: http://www.NeonColor.ru/articles/pikselnoe_upravlenie_svetodiodami/

Цифровой акселерометр LIS302DL

В этой статье я постораюсь поделится опытом работы с цифровым акселерометром от ST Microelectronics.Такой датчик позволяет получать данные о своем ускорении.

В отличии от аналоговых датчиков, где для чтения нужен АЦП, здесь необходимо лишь настроить сенсор на нужный режим работы и считать готовую инфу. Чтение происходит посредством либо SPI, либо I2C интерфейса, на выбор. Получив данные, микроконтроллер может использовать их как угодно.

Мне доводилось работать с 2-мя датчиками семейства — и . Отличаются они только количеством осей, поэтому далее буду говорить о 3-х осевом.

Основные фичи:

Программируемый предел измерения. Можно выбрать 2 фиксированных значения: 2G/8G. Нужно выставлять в зависимости от применения. Если поставить 2G, то можно точнее измерять не очень большие ускорения и наоборот для 8G.

Внутренний программный фильтр. Мега полезная вещь. Меняет характер выдаваемых данных с относительного на абсолютный и наоборот.

Поясню на примере: при выключенном фильтре сенсор будет постоянно «чувствовать» притяжение земли и если его ось Z будет направлена перпендикулярно земле, то по ней мы будем постоянно иметь максимальные значение ускорения.

А если включить фильтр и оставить датчик в покое, то пока мы не приложим к нему ускорение, на всех осях будет 0.

2 программируемых выхода прерываний. Если не нужно постоянно получать точное значение ускорения, а лишь превышение какого-либо порога, то можно задать этот самый порог и ждать изменения на соответствующей ноге.

Основной и сильно заметный (для начинающего) минус датчика — размер. Он очень маленький. Корпус (LGA14) совершенно не паябельный, но это только на первый взгляд. Я паял его по методу уважаемого DI HALT'а из .

Нарисовал footprint с направляющими уголками. Нанес припоя на дорожки, обильно смазал флюсом, отцентрировал по уголкам, и касаясь дорожек паяльником запаял датчик.

Если кто-то захочет повторить, то footprint'ы для Sprint Layout 5 и DipTrace можно найти в конце статьи.

Если же вы не уверены в твердости рук или просто не хотите парится, то можно найти готовые платки переходники, где все уже запаяно до нас. Также есть отладочные платы и от самих ST в том числе.

Схемы подключения на примере Tiny2313:

I2C — не забываем подтяжку обоих линий до VCC. Чтобы чип понял что мы хотим пообщаться с ним по 2-м проводам, нужно седьмую ногу (CS) подтянуть к VCC. Нога SDO в этом режиме служит для задания I2C адреса датчика: если её притянуть к VCC, то датчик отзовется на адрес 0b0011101, если к земле (как в примере) — на 0b0011100.

SPI — вывод CS (Chip Select) можно подключать к любой ноге МК, аппаратный интерфейс его не контролирует и приходится дергать его программно.

На обоих схемах подключены выводы прерываний (INT1, INT2 — восьмая и девятая ноги). Это необязательно, их нужно подключать по необходимости. Датчик питается напряжением от 2,16 до 3,6 В. Если у МК тоже низкое напряжения питания (в моем случае он с индексом «V», то есть с пониженным VCC), то оптимально питать их от одного источника, например в 3,3 В. Если же у МК VCC = 5В, то варианта 2: либо согласовывать I/O линии по уровням, либо забить и не согласовывать. В одном из девайсов я так и поступил, все работало, но так делать не стоит. Я вас предупредил:) Что касается программы, то используются аппаратная реализация интерфейса (USI). В прилагаемом архиве лежит проект на СИ для AVR STUDIO. МК — Tiny2313. Подключение к датчику по SPI. Программа читает регистр «WHO I AM» и шлет данные о ускорении по оси X через USART.

сенсора на момент написания ~ 170 р.

Источник: http://radistor.ru/blog/9.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

Библиотека SPI позволяет плате Arduino взаимодействовать с устройствами поддерживающими SPI протокол. Arduino в данном случае выступает в качестве ведущего устройства.

Описание SPI (Serial Peripheral Interface)

Последовательный периферийный интерфейс (SPI – Serial Peripheral Interface) — это синхронный протокол последовательной передачи данных, используемый для связи микроконтроллера с одним или несколькими периферийными устройствами.

Интерфейс SPI отличается относительно высокой скоростью и предназначен для связи близко расположенных устройств. Он также может использоваться для взаимодействия двух микроконтроллеров.

SPI также иногда называют четырёхпроводным интерфейсом.

Для организации соединения SPI необходимо одно ведущее устройство ( обычно это микроконтроллер) которое управляет соединением с ведомыми устройствами. Как правило, все взаимодействующие устройства объединены тремя общими линиями:

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

Помимо перечисленных, на каждое устройство обычно отводится отдельная линия:

  • SS (Slave Select) — контакт, присутствующий на каждом ведомом устройстве. Он предназначен для активизации ведущим того или иного периферийного устройства.

Линия SS обычно для каждого ведомого своя, но некоторых ведомых возможно подключить к одной SS — такой способ используется для каскадного подключения устройств (кольцевая схема).

Типичный алгоритм работы SPI

  • Master устанавливает низкий уровень на той линии SS, к которой подключен нужный Slave.
  • Master задаёт такт, генерируя импульсы синхронизации, на SCLK, и одновременно с каждым импульсом SCLK выставляет нужный уровень на MOSI, передавая Slave по биту за такт.
  • Slave на каждый импульс SCLK выставляет нужный уровень на MISO, передавая Master по биту за такт.
  • Для завершения передачи Master устанавливает высокий уровень на SS.

Регистры SPI:

Регистр управления

Ниже описаны значения восьми бит регистра управления интерфейса SPI.

  • Биты 0 и 1: SPR0 и SPR1 (SPI Clock Rate Select) — выбор частоты тактового сигнала. Биты предназначены для управления тактовой частотой, что актуально только для ведущего устройства.
  • Бит 2: CPHA (Clock Phase) — фаза тактового сигнала.
  • Бит 3: CPOL ( Clock Polarity) — полярность тактового сигнала.
  • Бит 4: MSTR (Master/Slave Select) — выбор режима «ведущий/ведомый». Установка бита в 1 переводит устройство в режим ведущего, установка бита в 0 — в режим ведомого.
  • Бит 5: DORD (Data Order) — порядок данных. Бит управляет порядком передачи данных (с бита 0 или с бита 7).
  • Бит 6: SPE (SPI Enable) — разрешение работы SPI. Установка бита в 1 разрешает работу интерфейса, сигналы от порта подключаются к внешним линиям связи интерфейса.
  • Бит 7: SPIE (SPI Interrupt Enable) — разрешение прерывания от SPI.

Регистр статуса

Ниже описаны значения восьми бит регистра статуса интерфейса SPI.

  • Биты 0…5 — зарезервированы, всегда установлены в 0.
  • Бит 6: WCOL ( Write Collision Flag) — флаг ошибки при записи. Бит устанавливается в 1 при записи в регистр в ходе обмена последовательными данными. Бит сбрасывается в 0 при чтении регистра статуса.
  • Бит 7: SPIF (SPI Interrupt Flag) — флаг прерывания SPI. Бит устанавливается в 1 при завершении обмена данными. Бит сбрасывается в 0 при считывании данных из буфера регистра данных.

Режимы работы интерфейса SPI

Возможны четыре комбинации фазы (CPHA) и полярности (CPOL) сигнала SCLK по отношению к сигналам данных. Режимы работы определяются комбинацией бит CPHA и CPOL:

  • CPOL = 0 — сигнал синхронизации начинается с низкого уровня;
  • CPOL = 1 — сигнал синхронизации начинается с высокого уровня;
  • CPHA = 0 — выборка данных производится по переднему фронту сигнала синхронизации;
  • CPHA = 1 — выборка данных производится по заднему фронту сигнала синхронизации.

Перед тем, как отправлять данные новому SPI-устройству, необходимо выяснить о нем несколько основных моментов:

  • Какой порядок вывода данных используется: сдвиг данных должен осуществляться, начиная со старшего бита (MSB) или с младшего бита (LSB)? Порядок следования данных контролируется функцией SPI.setBitOrder().
  • При отсутствии тактовых импульсов линия SCK должна находиться в высоком (HIGH) или низком (LOW) уровне?
  • Считывание данных происходит по фронту или по спаду тактового импульса? Эти режимы работы контролируются функцией SPI.setDataMode().
  • Какова должна быть скорость передачи данных по SPI? Этот параметр контролируется функцией SPI.setClockDivider().

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

Существует четыре режима передачи данных, отличающиеся условием сдвига данных (по фронту или по спаду синхро-импульсов – так называемая фаза), а также уровнем сигнала, в котором должна находится линия SCK при отсутствии синхро-импульсов (полярность). Различные комбинации фазы и полярности, формирующие четыре режима передачи данных, сведены в таблицу:

Режим Полярность (CPOL) Фаза (CPHA)
SPI_MODE0
SPI_MODE1 1
SPI_MODE2 1
SPI_MODE3 1 1

Для изменения режима передачи данных служит функция SPI.setDataMode().

Каждое SPI-устройство налагает определенные ограничения на максимальную скорость SPI-шины. Для корректной работы периферийных устройств в библиотеке предусмотрена функция SPI.setClockDivider(), позволяющая изменять тактовую частоту шины (по умолчанию 4 МГц).

После правильной настройки всех параметров SPI, останется только выяснить, какие регистры периферийного устройства отвечают за те или иные его функции. Как правило, это описано в техническом описании (datasheet) устройства.

Подключение

Ниже в таблице приведены номера выводов, использующиеся шиной SPI в тех или иных моделях платах Arduino:

Плата Arduino MOSI MISO SCK SS (slave) SS (master)
Uno или Duemilanove 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3 10
Mega1280 или Mega2560 51 или ICSP-4 50 или ICSP-1 52 или ICSP-3 53
Leonardo ICSP-4 ICSP-1 ICSP-3
Due ICSP-4 ICSP-1 ICSP-3 4, 10, 52

Обратите внимание, что на всех платах выводы MISO, MOSI и SCK соединены с одними и теми же контактами разъема ICSP. Такое расположение может быть удобно при создании универсальных плат расширения, работающих на всех моделях плат Arduino.

Замечание о работе контакта SS в платах на базе AVR

У всех моделей Arduino на основе микроконтроллеров AVR есть вывод SS, который используется в режиме работы Slave (т,е, если  Ардуино управляется внешним Мастером).

Однако, в данной библиотеке реализован только режим работы Master, поэтому в этом режиме вывод SS должен быть сконфигурирован как выход (OUTPUT).

В противном случае SPI может аппаратно переключиться в режим Slave, что приведет к неработоспособности функций библиотеки.

Тем не менее, в качестве SS для устройства можно использовать любой из доступных контактов. Например, на плате расширения Arduino Ethernet для взаимодействия со встроенной SD-картой и контроллером Ethernet по SPI используются выводы 4 и 10 соответственно.

Расширенные возможности SPI на Arduino Due

Существуют некоторые особенности работы с интерфейсом SPI на платах Arduino Due. Помимо основных функций и методов, применимых ко всем платам Ардуино, в библиотеке SPI предусмотрено несколько дополнительных методов. Эти методы реализовывают аппаратные возможности микроконтроллеров SAM3X и предоставляют разработчику расширенные возможности:

  • автоматический управление процессом выбора ведомого устройства;
  • автоматическое управление конфигурациями интерфейса SPI для различных устройств (тактовая частота, режим передачи данных и т.д.). Благодаря этому каждое из ведомых устройств может иметь собственный набор настроек, автоматически применяемых в начале передачи.

В Arduino Due есть три отдельных вывода (4, 10 и 52) для управления линиями SS периферийных устройств.

Методы

begin()

end()

setBitOrder()

setClockDivider()

setDataMode()

transfer()

Примеры

Смотрите также

Использование расширенных возможностей SPI на Arduino Due

shiftOut()

shiftIn()

Статья: SPI и Arduino

Источник: http://arduino.cc/en/Reference/SPI