Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sc18is600_arch.c
Go to the documentation of this file.
1#include "peripherals/sc18is600.h"
2
3#include <stm32/rcc.h>
4#include <stm32/spi.h>
5#include <stm32/exti.h>
6#include <stm32/misc.h>
7#include <stm32/dma.h>
8#include <stm32/gpio.h>
9
10/* commands definition */
11#define Sc18Is600_Cmd_Write 0x00
12#define Sc18Is600_Cmd_Read 0x01
13#define Sc18Is600_Cmd_Read_After_Write 0x02
14#define Sc18Is600_Cmd_Write_After_Write 0x03
15#define Sc18Is600_Cmd_Read_Buffer 0x06
16#define Sc18Is600_Cmd_Write_To_Reg 0x20
17#define Sc18Is600_Cmd_Read_From_Reg 0x21
18#define Sc18Is600_Cmd_Power_Down 0x30
19
20extern void exti2_irq_handler(void);
21extern void dma1_c4_irq_handler(void);
22
23static inline void sc18is600_setup_SPI_DMA(uint8_t _len);
24
26{
27
28 /* set slave select as output and assert it ( on PB12) */
36
37 /* configure external interrupt exti2 on PD2( data ready ) */
43
49 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
51
53 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
54 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
55 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
56 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
57
59
60 /* Enable DMA1 channel4 IRQ Channel */
62 .NVIC_IRQChannel = DMA1_Channel4_IRQn,
63 .NVIC_IRQChannelPreemptionPriority = 0,
64 .NVIC_IRQChannelSubPriority = 0,
65 .NVIC_IRQChannelCmd = ENABLE
66 };
68 /* Enable SPI2 Periph clock -------------------------------------------------*/
70
71 /* Configure GPIOs: SCK, MISO and MOSI --------------------------------*/
76
78
79
80 /* configure SPI */
88 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
90 SPI_InitStructure.SPI_CRCPolynomial = 7;
92
93 /* Enable SPI */
95
96 /* Enable SPI_2 DMA clock ---------------------------------------------------*/
98
99}
100
102{
103 /* SPI2_Rx_DMA_Channel configuration ------------------------------------*/
106 .DMA_PeripheralBaseAddr = (uint32_t)(SPI2_BASE + 0x0C),
107 .DMA_MemoryBaseAddr = (uint32_t)sc18is600.priv_rx_buf,
108 .DMA_DIR = DMA_DIR_PeripheralSRC,
109 .DMA_BufferSize = _len,
110 .DMA_PeripheralInc = DMA_PeripheralInc_Disable,
111 .DMA_MemoryInc = DMA_MemoryInc_Enable,
112 .DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte,
113 .DMA_MemoryDataSize = DMA_MemoryDataSize_Byte,
114 .DMA_Mode = DMA_Mode_Normal,
115 .DMA_Priority = DMA_Priority_VeryHigh,
116 .DMA_M2M = DMA_M2M_Disable
117 };
119 /* SPI2_Tx_DMA_Channel configuration ------------------------------------*/
122 .DMA_PeripheralBaseAddr = (uint32_t)(SPI2_BASE + 0x0C),
123 .DMA_MemoryBaseAddr = (uint32_t)sc18is600.priv_tx_buf,
124 .DMA_DIR = DMA_DIR_PeripheralDST,
125 .DMA_BufferSize = _len,
126 .DMA_PeripheralInc = DMA_PeripheralInc_Disable,
127 .DMA_MemoryInc = DMA_MemoryInc_Enable,
128 .DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte,
129 .DMA_MemoryDataSize = DMA_MemoryDataSize_Byte,
130 .DMA_Mode = DMA_Mode_Normal,
131 .DMA_Priority = DMA_Priority_Medium,
132 .DMA_M2M = DMA_M2M_Disable
133 };
135
136 /* Enable SPI_2 Rx request */
138 /* Enable DMA1 Channel4 */
140
141 /* Enable SPI_2 Tx request */
143 /* Enable DMA1 Channel5 */
145
146 /* Enable DMA1 Channel4 Transfer Complete interrupt */
148}
149
150
163
165{
166
167}
168
182
193
194
205
206#define ReadI2CStatReg() { \
207 sc18is600.priv_tx_buf[0] = Sc18Is600_Cmd_Read_From_Reg; \
208 sc18is600.priv_tx_buf[1] = Sc18Is600_I2CStat; \
209 sc18is600.priv_tx_buf[2] = 0; \
210 Sc18Is600Select(); \
211 sc18is600_setup_SPI_DMA(3); \
212 }
213
214
216{
217 /* clear EXTI */
220 }
221 switch (sc18is600.transaction) {
222 case Sc18Is600Receive:
228 }
229 break;
232 // should not happen
233 break;
234 default:
235 break;
236 }
237
238}
239
240
241
243{
244
246 /* Disable SPI_2 Rx and TX request */
249 /* Disable DMA1 Channel4 and 5 */
252
253 switch (sc18is600.transaction) {
258 break;
267 }
268 break;
269 case Sc18Is600Receive:
277 // debug
278 for (int i = 1; i < sc18is600.rx_len + 1; i++) { sc18is600.priv_tx_buf[i] = 0; }
284 }
285 break;
286 default:
287 break;
288 }
289
290}
#define RESET
Definition humid_sht.c:62
uint16_t foo
Definition main_demo5.c:58
struct Sc18Is600 sc18is600
Definition sc18i600.c:3
enum Sc18Is600Transaction transaction
Definition sc18i600.h:35
enum Sc18Is600Status status
Definition sc18i600.h:34
@ Sc18Is600Transmit
Definition sc18i600.h:25
@ Sc18Is600Receive
Definition sc18i600.h:26
@ Sc18Is600Transcieve
Definition sc18i600.h:27
@ Sc18Is600ReadRegister
Definition sc18i600.h:28
@ Sc18Is600WriteRegister
Definition sc18i600.h:29
uint8_t priv_tx_buf[SC18IS600_BUF_LEN]
Definition sc18i600.h:36
uint8_t i2c_status
Definition sc18i600.h:39
uint8_t priv_rx_buf[SC18IS600_BUF_LEN]
Definition sc18i600.h:37
@ Sc18Is600ReadingBuffer
Definition sc18i600.h:20
@ Sc18Is600ReadingI2CStat
Definition sc18i600.h:19
@ Sc18Is600TransactionComplete
Definition sc18i600.h:21
@ Sc18Is600WaitingForI2C
Definition sc18i600.h:18
@ Sc18Is600SendingRequest
Definition sc18i600.h:17
uint8_t rx_len
Definition sc18i600.h:38
void sc18is600_read_from_register(uint8_t addr)
void sc18is600_arch_init(void)
void exti2_irq_handler(void)
void sc18is600_write_to_register(uint8_t addr, uint8_t value)
void sc18is600_receive(uint8_t addr, uint8_t len)
void dma1_c4_irq_handler(void)
#define Sc18Is600_Cmd_Read_After_Write
#define Sc18Is600_Cmd_Read_Buffer
void sc18is600_tranceive(uint8_t addr, uint8_t len_tx, uint8_t len_rx)
#define Sc18Is600_Cmd_Write
#define ReadI2CStatReg()
void sc18is600_transmit(uint8_t addr, uint8_t len)
static void sc18is600_setup_SPI_DMA(uint8_t _len)
#define Sc18Is600_Cmd_Read_From_Reg
#define Sc18Is600_Cmd_Write_To_Reg
#define Sc18Is600Unselect()
#define Sc18Is600Select()
#define GPIOB
Definition gpio_arch.h:35
#define GPIOD
Definition gpio_arch.h:37
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.