SPI HAL Yazilim

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 33

UYGULAMALI GÖMÜLÜ SİSTEMLER

STM32F10x, HAL Sürücüsü ve Çevre Birimi Yapılandırması

Dr. Öğr. Üyesi Barış GÖKÇE


BÖLÜM 1
HAL SPI Genel Sürücü
(HAL SPI Generic Driver)

+
STM32F103
STM32F10x
www.gomulusistemler.org
SPI_HandleTypeDef
SPI_HandleTypeDef Veri Yapısı
• SPI_TypeDef * Instance
• SPI_InitTypeDef Init
• uint8_t * pTxBuffPtr
• uint16_t TxXferSize
• __IO uint16_t TxXferCount
• uint8_t * pRxBuffPtr
• uint16_t RxXferSize
• __IO uint16_t RxXferCount
• void(* RxISR
• void(* TxISR
• DMA_HandleTypeDef * hdmatx
• DMA_HandleTypeDef * hdmarx
• HAL_LockTypeDef Lock
• __IO HAL_SPI_StateTypeDef State
• __IO uint32_t ErrorCode

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI_HandleTypeDef
• SPI_TypeDef* SPI_HandleTypeDef::Instance
• SPI registeri adresi
• SPI_InitTypeDef SPI_HandleTypeDef::Init
• SPI iletişim parametreleri
• uint8_t* SPI_HandleTypeDef::pTxBuffPtr
• SPI Tx transfer Tamponu Pointeri
• uint16_t SPI_HandleTypeDef::TxXferSize
• SPI Tx Transfer boyutu
• IO uint16_t SPI_HandleTypeDef::TxXferCount
• SPI Tx Transfer Sayısı
• uint8_t* SPI_HandleTypeDef::pRxBuffPtr
• SPI Rx transfer Tampon Pointeri
• uint16_t SPI_HandleTypeDef::RxXferSize
• SPI Rx Transfer boyutu
• IO uint16_t SPI_HandleTypeDef::RxXferCount
• SPI Rx Transfer sayısı

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI_HandleTypeDef
• void(* SPI_HandleTypeDef::RxISR)(struct SPI_HandleTypeDef *hspi)
• Rx ISR’deki Pointer funksiyonu
• void(* SPI_HandleTypeDef::TxISR)(struct SPI_HandleTypeDef *hspi)
• Tx ISR’deki Pointer funksiyonu
• DMA_HandleTypeDef* SPI_HandleTypeDef::hdmatx
• SPI Tx DMA Handle parametreleri
• DMA_HandleTypeDef* SPI_HandleTypeDef::hdmarx
• SPI Rx DMA Handle parametreleri
• HAL_LockTypeDef SPI_HandleTypeDef::Lock
• Kilitleme nesnei
• IO HAL_SPI_StateTypeDef SPI_HandleTypeDef::State
• SPI iletişim durumu

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI_InitTypeDef
SPI_InitTypeDef

• uint32_t Mode
• uint32_t Direction
• uint32_t DataSize
• uint32_t CLKPolarity
• uint32_t CLKPhase
• uint32_t NSS
• uint32_t BaudRatePrescaler
• uint32_t FirstBit
• uint32_t TIMode uint32_t
• CRCCalculation uint32_t
• CRCPolynomial

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI_InitTypeDef
• uint32_t SPI_InitTypeDef::Mode
• SPI işletim modunu belirtir. Bu parametre bir SPI_Mode değeri olabilir.
• uint32_t SPI_InitTypeDef::Direction
• SPI Yön modu durumunu belirtir. Bu parametre bir SPI_Direction değeri olabilir
• uint32_t SPI_InitTypeDef::DataSize

SPI veri boyutunu belirtir. Bu parametre bir SPI_Data_Size değeri olabilir.
• uint32_t SPI_InitTypeDef::CLKPolarity
• Seri saatin sabit durumunu belirtir. Bu parametre bir SPI_Clock_Polarity değeri olabilir.
• uint32_t SPI_InitTypeDef::CLKPhase
• Bit yakalama için saat etkin kenarını belirtir. Bu parametre bir SPI_Clock_Phase değeri olabilir.
• uint32_t SPI_InitTypeDef::NSS
• NSS sinyalinin donanım (NSS pin) veya SSI bit kullanan yazılım tarafından yönetilip yönetilmediğini belirtir. Bu
parametre bir SPI_Slave_Select_management değeri olabilir.

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI_InitTypeDef
• uint32_t SPI_InitTypeDef::BaudRatePrescaler
• Gönderme ve alma SCK saatini yapılandırmak için kullanılacak Baud Hızı ön ölçekleyici değerini belirtir.
Bu parametre SPI_BaudRate_Prescaler değeri olabilir Not: İletişim saati Master saatten türetilir. Slave
saatin ayarlanması gerekmez.
• uint32_t SPI_InitTypeDef::FirstBit
• Veri aktarımlarının MSB veya LSB bitinden başlayıp başlamadığını belirtir. Bu parametre bir
SPI_MSB_LSB_transmission değeri olabilir.
• uint32_t SPI_InitTypeDef::TIMode
• TI modunun etkin olup olmadığını belirtir. Bu parametre bir SPI_TI_mode değeri olabilir.
• uint32_t SPI_InitTypeDef::CRCCalculation
• CRC hesaplamasının etkin olup olmadığını belirtir. Bu parametre bir SPI_CRC_Calculation değeri
olabilir.
• uint32_t SPI_InitTypeDef::CRCPolynomial
• CRC hesaplaması için kullanılan polinomu belirtir. Bu parametre Min_Data = 0 ile Max_Data = 65535
arasında bir sayı olmalıdır.

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI Firmware Sürücüsü API Kullanımı
1. Bir SPI_HandleTypeDef tanıtıcı yapısı bildirin, örneğin: SPI_HandleTypeDef hspi1;
2. HAL_SPI_MspInit() API'sini uygulayarak SPI düşük seviye kaynaklarını başlatın:
a. SPIx arayüz saatini etkinleştirme
b. SPI pinleri yapılandırması
SPI GPIO'lar için saati etkinleştirme
Bu SPI pinlerini alternatif işlev push-pull olarak yapılandırın
c. Kesme işlemini kullanmanız gerekiyorsa NVIC yapılandırması SPIx kesme önceliğini yapılandırma
NVIC SPI IRQ tanıtıcısını etkinleştirme
d. DMA işlemini kullanmanız gerekiyorsa DMA Yapılandırması
Gönderme veya alma Kanalı için bir DMA_HandleTypeDef tanıtıcı yapısı bildirme
DMAx saatini etkinleştirme
DMA tanıtıcı parametrelerini yapılandırma DMA Tx veya Rx Kanalını yapılandırma
Başlatılmamış hdma_tx (veya _rx) tanıtıcısını hspi DMA Tx (veya Rx) tanıtıcıyla ilişkilendirme
Önceliği yapılandırın ve DMA Tx veya Rx Kanalında aktarım tamamlanması kesintisi için NVIC'yi etkinleştirin

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI Firmware Sürücüsü API Kullanımı
3. hspi Init yapısında Mod, BidirectionalMode, Veri boyutu, Baudrate Presaler, NSS yönetimi, Saat polaritesi ve fazı,
FirstBit ve CRC yapılandırmasını programlayın.
4. HAL_SPI_Init() API'sini çağırarak SPI kayıtlarını başlatın:
Bu API ayrıca özelleştirilmiş HAL_SPI_MspInit () API'sini çağırarak düşük düzey Donanım GPIO, CLOCK, CORTEX ... vb.

Çevrimsel mod kısıtlaması:


1. SPI şu modlarda yapılandırıldığında DMA çevrimsel modu kullanılamaz:
a. Master 2Line RxOnly
b. Master 1Line Rx

2. DMA çevrimsel modu etkinleştirildiğinde CRC özelliği yönetilmez


3. SPI DMA Duraklat / Durdur özellikleri kullanıldığında, yalnızca SPI geri çağrıları altında HAL_SPI_DMAPause() /
HAL_SPI_DMAStop() aşağıdaki API'ları kullanmalıyız

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI Firmware Sürücüsü API Kullanımı
Master Modda Alma (Master Receive ) modu kısıtlaması:
1) SPI'nin yeni bir başlatma yapmadığından emin olmak için Ana tek yönlü alma modu (MSTR =
1, BIDIMODE = 0, RXONLY = 0) veya çift yönlü alma modunda (MSTR = 1, BIDIMODE = 1,
BIDIOE = 0) transfer aşağıdaki prosedüre uyulmalıdır:
a. HAL_SPI_DeInit ()
b. HAL_SPI_Init ()

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


Başlatma ve sıfırlama fonksiyonları
Kullanıcı, ilgili tüm çevrebirim kaynaklarını (CLOCK, GPIO, DMA, IT ve NVIC) yapılandırdığı
HAL_SPI_MspInit () işlevini uygulamalıdır. Seçilen cihazı seçilen yapılandırmayla yapılandırmak
için HAL_SPI_Init () işlevini çağırın.
Bu bölümün API’leri
• HAL_SPI_Init()
• HAL_SPI_DeInit()
• HAL_SPI_MspInit()
• HAL_SPI_MspDeInit()

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


Giriş/ Çıkış (IO) Operasyon Fonksiyonları
1) SPI İletim ve alımında İki aktarım modu vardır. Bunlar
i. önleyici/engelleme (Blocking) modu: İletişim yoklama modunda gerçekleştirilir. Tüm veri işlemenin
HAL durumu, aktarım bittikten sonra aynı işlev tarafından döndürülür.
ii. Önleyici/engelleme olmayan (Non-Blocking) modu: İletişim Kesmeler veya DMA kullanılarak
gerçekleştirilir, Bu API'ler HAL durumunu döndürür. Veri işlemenin sonu, Kesme modu kullanılırken
özel SPI IRQ veya DMA modu kullanılırken DMA IRQ aracılığıyla belirtilir. HAL_SPI_TxCpltCallback (),
HAL_SPI_RxCpltCallback() ve HAL_SPI_TxRxCpltCallback() kullanıcı geri çağrıları, bir iletişim hatası
tespit edildiğinde sırasıyla HAL_SPI_ErrorCallback() kullanıcı geri araması yürütülür

2) Bu 2 aktarım modu için sağlanan API’ler (Kesme modu veya Kesme veya DMA kullanılarak
engellenme olmayan mod) 1Line (simpleks) ve 2Lines (tam dupleks) modları için mevcuttur.

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


Giriş/ Çıkış (IO) Operasyon Fonksiyonları
• HAL_SPI_Transmit() • HAL_SPI_DMAResume()
• HAL_SPI_Receive() • HAL_SPI_DMAStop()
• HAL_SPI_TransmitReceive() • HAL_SPI_IRQHandler()
• HAL_SPI_Transmit_IT() • HAL_SPI_TxCpltCallback()
• HAL_SPI_Receive_IT() • HAL_SPI_RxCpltCallback()
• HAL_SPI_TransmitReceive_IT() • HAL_SPI_TxRxCpltCallback()
• HAL_SPI_Transmit_DMA() • HAL_SPI_TxHalfCpltCallback()
• HAL_SPI_Receive_DMA() • HAL_SPI_RxHalfCpltCallback()
• HAL_SPI_TransmitReceive_DMA() • HAL_SPI_TxRxHalfCpltCallback()
• HAL_SPI_Abort_IT() • HAL_SPI_ErrorCallback()
• HAL_SPI_DMAPause() • HAL_SPI_AbortCpltCallback()

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


Çevresel Durum ve Hatalar fonksiyonları
1) HAL_SPI_GetState()
2) HAL_SPI_GetError()

• HAL_SPI_GetState() API'si çalışma zamanında SPI çevre biriminin durumunu kontrol etmek
için kullanılır.
• HAL_SPI_GetError() çalışma zamanında giriş İletişim sırasında meydana gelen hatalar kontrol
etmek için kullanılır.

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI Firmware sürücü tanımlamaları
SPI BaudRate Prescaler
SPI Data Size
SPI_BAUDRATEPRESCALER_2
SPI_DATASIZE_8BIT
SPI_BAUDRATEPRESCALER_4
SPI_DATASIZE_16BIT
SPI_BAUDRATEPRESCALER_8
SPI Direction Mode
SPI_BAUDRATEPRESCALER_16
SPI_DIRECTION_2LINES
SPI_BAUDRATEPRESCALER_32
SPI_DIRECTION_2LINES_RXONLY
SPI_BAUDRATEPRESCALER_64
SPI_DIRECTION_1LINE
SPI_BAUDRATEPRESCALER_128
SPI Error Code
SPI_BAUDRATEPRESCALER_256
HAL_SPI_ERROR_NONE No error
SPI Clock Phase
HAL_SPI_ERROR_MODF MODF error
SPI_PHASE_1EDGE
HAL_SPI_ERROR_CRC CRC error
SPI_PHASE_2EDGE
HAL_SPI_ERROR_OVR OVR error
SPI Clock Polarity
HAL_SPI_ERROR_FRE FRE error
SPI_POLARITY_LOW
HAL_SPI_ERROR_DMA DMA transfer error
SPI_POLARITY_HIGH
HAL_SPI_ERROR_FLAG Flag: RXNE,TXE, BSY
SPI CRC Calculation
SPI_CRCCALCULATION_DISABLE
SPI_CRCCALCULATION_ENABLE

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI Firmware sürücü tanımlamaları

SPI Flags Definition SPI Mode


• SPI_FLAG_RXNE • SPI_MODE_SLAVE
• SPI_FLAG_TXE • SPI_MODE_MASTER
• SPI_FLAG_BSY SPI MSB LSB Transmission
• SPI_FLAG_CRCERR • SPI_FIRSTBIT_MSB
• SPI_FLAG_MODF • SPI_FIRSTBIT_LSB
• SPI_FLAG_OVR SPI Slave Select Management
SPI Interrupt Definition • SPI_NSS_SOFT
• SPI_IT_TXE • SPI_NSS_HARD_INPUT
• SPI_IT_RXNE • SPI_NSS_HARD_OUTPUT
• SPI_IT_ERR SPI TI Mode
• SPI_TIMODE_DISABLE

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI Harici Makrolar
1) __HAL_SPI_RESET_HANDLE_STATE
2) __HAL_SPI_ENABLE_IT
3) __HAL_SPI_DISABLE_IT
4) __HAL_SPI_GET_IT_SOURCE
5) __HAL_SPI_GET_FLAG
6) __HAL_SPI_CLEAR_CRCERRFLAG
7) __HAL_SPI_CLEAR_MODFFLAG
8) __HAL_SPI_CLEAR_OVRFLAG
9) __HAL_SPI_ENABLE
10) __HAL_SPI_DISABLE

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


https://github.com/brgokce/

<<<

Dr. Barış GÖKÇE https://github.com/brgokce/STM32F103

SPI (POLLING MODE) ÖRNEĞİ

https://github.com/brgokce/STM32F103BÖLÜM 2
www.gomulusistemler.org
Blok Diyagram
USART3

USART3
USART1

USART2

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI İki Kart Bağlantısı
STM32F103 SPI MASTER

STM32F103 STM32F103
SPI SLAVE SPI MASTER

STM32F103 SPI SLAVE


www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE
https://github.com/brgokce/

<<<

Dr. Barış GÖKÇE https://github.com/brgokce/STM32F103

SPI KESME MODU (INTERRUPT) ÖRNEĞİ

https://github.com/brgokce/STM32F103BÖLÜM 3
www.gomulusistemler.org
Blok Diyagram
USART3

USART3
USART1

USART2

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI İki Kart Bağlantısı
STM32F103 SPI MASTER

STM32F103 STM32F103
SPI SLAVE SPI MASTER

STM32F103 SPI SLAVE


www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE
https://github.com/brgokce/

Dr. Barış GÖKÇE https://github.com/brgokce/STM32F103

SPI DMA ÖRNEĞİ (İKİ KART HABERLEŞMESİ)

https://github.com/brgokce/STM32F103BÖLÜM 4
www.gomulusistemler.org
SPI DMA - ADC

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI DMA – ADC CubeIDE Perspektifi

STM32F103
STM32F103
SPI MASTER
SPI SLAVE
www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE
Her bir kanal için DMA1 İstek tablosu

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


https://github.com/brgokce/

Dr. Barış GÖKÇE https://github.com/brgokce/STM32F103

SPI - ADXL345 ÖRNEĞİ

https://github.com/brgokce/STM32F103BÖLÜM 5
www.gomulusistemler.org
ADXL324- STM32F103 BAĞLANTISI

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


DXL345'in Veri SayfasI (Datasheet)
1) SPI için, Şekil 34 ve Şekil 35'teki bağlantı şemalarında gösterildiği gibi 3-
veya 4 telli yapılandırma mümkündür. DATA_FORMAT kaydında (Adres
0x31) SPI bitinin (Bit D6) sıfırlanması 4 hatlı modu seçer. SPI bitinin set
edilmesi 3 hatlı modu seçer. Maksimum SPI saat hızı 100pF maksimum
yükleme ile 5 MHz'dir ve zamanlama şeması saat polaritesini (CPOL) = 1 ve
saat fazını (CPHA) = 1 takip eder. ADXL345'e güç uygulanırsa, ana makine
işlemcisinin saat polaritesi ve fazı yapılandırılmadan önce, saat pini ve faz
değiştirilmeden önce CS pini yükseğe çekilmelidir. 3 hatlı SPI kullanılırken,
SDO piminin 10 kΩ direnç üzerinden VDD G/Ç'ye kadar çekilmesi veya
GND'ye çekilmesi önerilir.

2) Yukarıdaki şekle göre, saat hızını 5MHz'den az ve ayrıca CPOL = 1 ve CPHA


= 1 olan SPI'yi kurmamız gerekiyor. 4 telli modu kullanacağız, ayarlayalım .
www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE
DXL345'in Veri SayfasI (Datasheet)
Tek bir iletimde birden çok bayt okumak veya
yazmak için, ilk bayt aktarımında R/W bitinden
sonra (Şekil 37'den Şekil 39'a MB) yer alan çoklu
bayt biti ayarlanmalıdır. Kayıt adresleme ve ilk bayt
veri sonra, sonraki her bir saat darbesi (sekiz saat
darbesi) set ADXL345 bir okuma veya yazma için bir
sonraki kayıt için işaret neden olur. Bu değişim, saat
darbeleri sona erene ve CS iptal edilene kadar
devam eder. Farklı, sonuçsal kayıtlarda okuma veya
yazma işlemleri yapabilmek için, aktarımlar
arasında CS bildirimi kaldırılmalı ve yeni kayıt ayrı
olarak ele alınmalıdır.

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


SPI OKUMA ve YAZMA
Burada aşağıdaki adımları uygulayarak
okuma işlemi yapıyoruz okuyoruz: -
•Slave’i etkinleştirmek için CS düşük çekin
1 •Okuma yapılacak adresi iletin
0
•Veriyi alın. Bu durumda 6 bayt olur
•Slave’i devre dışı bırakmak için CS pimini
yükseğe çekin

NOT adresi 0x80 ve 0x40 ile


VEYA’layın. Çünkü ADXL veri sayfasına göre,
1 1 Verileri okumak istiyorsak, son biti YÜKSEK
ayarlamamız gerekir ve ayrıca çok baytlı okuma
/ yazma için 6. bit YÜKSEK olmalıdır

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE


dxl_write (0x2d, 0x08);
// power_cntl ölç and 8hz'de uyan

adxl_write (0x31, 0x01);


// data_format aralığı = +- 4g

www.gomulusistemler.org Dr. Öğr. Üyesi Barış GÖKÇE

You might also like