44 #ifdef PRINT_CSV_FORMAT 45 extern volatile uint32_t ms_counter;
66 #define MAX_BUFFER_SIZE 255 67 #define TIMEOUT_DURATION 15 77 SPI_HandleTypeDef SpiHandle;
100 #ifdef PRINT_CSV_FORMAT 107 void print_csv_time(
void){
108 uint32_t ms = ms_counter;
109 PRINT_CSV(
"%02d:%02d:%02d.%03d", ms/(60*60*1000)%24, ms/(60*1000)%60, (ms/1000)%60, ms%1000);
121 GPIO_InitTypeDef GPIO_InitStruct;
122 if(hspi->Instance==BNRG_SPI_INSTANCE)
127 BNRG_SPI_RESET_CLK_ENABLE();
128 BNRG_SPI_SCLK_CLK_ENABLE();
129 BNRG_SPI_MISO_CLK_ENABLE();
130 BNRG_SPI_MOSI_CLK_ENABLE();
131 BNRG_SPI_CS_CLK_ENABLE();
132 BNRG_SPI_IRQ_CLK_ENABLE();
135 BNRG_SPI_CLK_ENABLE();
138 GPIO_InitStruct.Pin = BNRG_SPI_RESET_PIN;
139 GPIO_InitStruct.Mode = BNRG_SPI_RESET_MODE;
140 GPIO_InitStruct.Pull = BNRG_SPI_RESET_PULL;
141 GPIO_InitStruct.Speed = BNRG_SPI_RESET_SPEED;
142 GPIO_InitStruct.Alternate = BNRG_SPI_RESET_ALTERNATE;
143 HAL_GPIO_Init(BNRG_SPI_RESET_PORT, &GPIO_InitStruct);
144 HAL_GPIO_WritePin(BNRG_SPI_RESET_PORT, BNRG_SPI_RESET_PIN, GPIO_PIN_RESET);
147 GPIO_InitStruct.Pin = BNRG_SPI_SCLK_PIN;
148 GPIO_InitStruct.Mode = BNRG_SPI_SCLK_MODE;
149 GPIO_InitStruct.Pull = BNRG_SPI_SCLK_PULL;
150 GPIO_InitStruct.Speed = BNRG_SPI_SCLK_SPEED;
151 GPIO_InitStruct.Alternate = BNRG_SPI_SCLK_ALTERNATE;
152 HAL_GPIO_Init(BNRG_SPI_SCLK_PORT, &GPIO_InitStruct);
155 GPIO_InitStruct.Pin = BNRG_SPI_MISO_PIN;
156 GPIO_InitStruct.Mode = BNRG_SPI_MISO_MODE;
157 GPIO_InitStruct.Pull = BNRG_SPI_MISO_PULL;
158 GPIO_InitStruct.Speed = BNRG_SPI_MISO_SPEED;
159 GPIO_InitStruct.Alternate = BNRG_SPI_MISO_ALTERNATE;
160 HAL_GPIO_Init(BNRG_SPI_MISO_PORT, &GPIO_InitStruct);
163 GPIO_InitStruct.Pin = BNRG_SPI_MOSI_PIN;
164 GPIO_InitStruct.Mode = BNRG_SPI_MOSI_MODE;
165 GPIO_InitStruct.Pull = BNRG_SPI_MOSI_PULL;
166 GPIO_InitStruct.Speed = BNRG_SPI_MOSI_SPEED;
167 GPIO_InitStruct.Alternate = BNRG_SPI_MOSI_ALTERNATE;
168 HAL_GPIO_Init(BNRG_SPI_MOSI_PORT, &GPIO_InitStruct);
171 GPIO_InitStruct.Pin = BNRG_SPI_CS_PIN;
172 GPIO_InitStruct.Mode = BNRG_SPI_CS_MODE;
173 GPIO_InitStruct.Pull = BNRG_SPI_CS_PULL;
174 GPIO_InitStruct.Speed = BNRG_SPI_CS_SPEED;
175 GPIO_InitStruct.Alternate = BNRG_SPI_CS_ALTERNATE;
176 HAL_GPIO_Init(BNRG_SPI_CS_PORT, &GPIO_InitStruct);
177 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
180 GPIO_InitStruct.Pin = BNRG_SPI_IRQ_PIN;
181 GPIO_InitStruct.Mode = BNRG_SPI_IRQ_MODE;
182 GPIO_InitStruct.Pull = BNRG_SPI_IRQ_PULL;
183 GPIO_InitStruct.Speed = BNRG_SPI_IRQ_SPEED;
184 GPIO_InitStruct.Alternate = BNRG_SPI_IRQ_ALTERNATE;
185 HAL_GPIO_Init(BNRG_SPI_IRQ_PORT, &GPIO_InitStruct);
188 HAL_NVIC_SetPriority(BNRG_SPI_EXTI_IRQn, 3, 0);
206 Timer_Set(&t, CLOCK_SECOND/10);
208 #ifdef PRINT_CSV_FORMAT 210 for (
int i=0; i<n_bytes1; i++) {
211 PRINT_CSV(
" %02x", ((uint8_t *)data1)[i]);
213 for (
int i=0; i<n_bytes2; i++) {
214 PRINT_CSV(
" %02x", ((uint8_t *)data2)[i]);
220 if(
BlueNRG_SPI_Write(&SpiHandle, (uint8_t *)data1,(uint8_t *)data2, n_bytes1, n_bytes2)==0)
break;
221 if(Timer_Expired(&t)){
235 SpiHandle.Instance = BNRG_SPI_INSTANCE;
236 SpiHandle.Init.Mode = BNRG_SPI_MODE;
237 SpiHandle.Init.Direction = BNRG_SPI_DIRECTION;
238 SpiHandle.Init.DataSize = BNRG_SPI_DATASIZE;
239 SpiHandle.Init.CLKPolarity = BNRG_SPI_CLKPOLARITY;
240 SpiHandle.Init.CLKPhase = BNRG_SPI_CLKPHASE;
241 SpiHandle.Init.NSS = BNRG_SPI_NSS;
242 SpiHandle.Init.FirstBit = BNRG_SPI_FIRSTBIT;
243 SpiHandle.Init.TIMode = BNRG_SPI_TIMODE;
244 SpiHandle.Init.CRCPolynomial = BNRG_SPI_CRCPOLYNOMIAL;
245 SpiHandle.Init.BaudRatePrescaler = BNRG_SPI_BAUDRATEPRESCALER;
246 SpiHandle.Init.CRCCalculation = BNRG_SPI_CRCCALCULATION;
248 HAL_SPI_Init(&SpiHandle);
258 HAL_GPIO_WritePin(BNRG_SPI_RESET_PORT, BNRG_SPI_RESET_PIN, GPIO_PIN_RESET);
260 HAL_GPIO_WritePin(BNRG_SPI_RESET_PORT, BNRG_SPI_RESET_PIN, GPIO_PIN_SET);
272 if (HAL_GPIO_ReadPin(BNRG_SPI_EXTI_PORT, BNRG_SPI_EXTI_PIN) == GPIO_PIN_SET)
304 uint8_t char_ff = 0xff;
305 volatile uint8_t read_char;
307 uint8_t header_master[HEADER_SIZE] = {0x0b, 0x00, 0x00, 0x00, 0x00};
308 uint8_t header_slave[HEADER_SIZE];
311 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_RESET);
314 HAL_SPI_TransmitReceive(hspi, header_master, header_slave, HEADER_SIZE, TIMEOUT_DURATION);
316 if (header_slave[0] == 0x02) {
318 byte_count = (header_slave[4]<<8)|header_slave[3];
319 if (byte_count > 0) {
322 if (byte_count > buff_size){
323 byte_count = buff_size;
326 for (len = 0; len < byte_count; len++){
328 HAL_SPI_TransmitReceive(hspi, &char_ff, (uint8_t*)&read_char, 1, TIMEOUT_DURATION);
330 buffer[len] = read_char;
335 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
339 for(
volatile int i = 0; i < 2; i++)__NOP();
341 #ifdef PRINT_CSV_FORMAT 344 for (
int i=0; i<len; i++) {
345 PRINT_CSV(
" %02x", buffer[i]);
364 uint8_t* data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2)
368 int32_t spi_fix_enabled = 0;
370 #ifdef ENABLE_SPI_FIX 372 #endif //ENABLE_SPI_FIX 374 unsigned char header_master[HEADER_SIZE] = {0x0a, 0x00, 0x00, 0x00, 0x00};
375 unsigned char header_slave[HEADER_SIZE] = {0xaa, 0x00, 0x00, 0x00, 0x00};
377 unsigned char read_char_buf[MAX_BUFFER_SIZE];
387 if (spi_fix_enabled) {
395 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_RESET);
399 HAL_SPI_TransmitReceive(hspi, header_master, header_slave, HEADER_SIZE, TIMEOUT_DURATION);
402 if (spi_fix_enabled) {
406 if (header_slave[0] == 0x02) {
408 if (header_slave[1] >= (Nb_bytes1+Nb_bytes2)) {
413 HAL_SPI_TransmitReceive(hspi, data1, read_char_buf, Nb_bytes1, TIMEOUT_DURATION);
419 HAL_SPI_TransmitReceive(hspi, data2, read_char_buf, Nb_bytes2, TIMEOUT_DURATION);
434 HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
449 GPIO_InitTypeDef GPIO_InitStructure;
452 GPIO_InitStructure.Pin = BNRG_SPI_IRQ_PIN;
453 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
454 GPIO_InitStructure.Speed = BNRG_SPI_IRQ_SPEED;
455 GPIO_InitStructure.Pull = GPIO_NOPULL;
456 HAL_GPIO_Init(BNRG_SPI_IRQ_PORT, &GPIO_InitStructure);
457 HAL_GPIO_WritePin(BNRG_SPI_IRQ_PORT, BNRG_SPI_IRQ_PIN, GPIO_PIN_SET);
467 GPIO_InitTypeDef GPIO_InitStructure;
470 GPIO_InitStructure.Pin = BNRG_SPI_IRQ_PIN;
471 GPIO_InitStructure.Mode = BNRG_SPI_IRQ_MODE;
472 GPIO_InitStructure.Pull = GPIO_PULLDOWN;
473 GPIO_InitStructure.Speed = BNRG_SPI_IRQ_SPEED;
474 GPIO_InitStructure.Alternate = BNRG_SPI_IRQ_ALTERNATE;
475 HAL_GPIO_Init(BNRG_SPI_IRQ_PORT, &GPIO_InitStructure);
477 GPIO_InitStructure.Pull = BNRG_SPI_IRQ_PULL;
478 HAL_GPIO_Init(BNRG_SPI_IRQ_PORT, &GPIO_InitStructure);
489 #if SYSCLK_FREQ == 4000000 490 for(
volatile int i = 0; i < 35; i++)__NOP();
491 #elif SYSCLK_FREQ == 32000000 492 for(
volatile int i = 0; i < 420; i++)__NOP();
493 #elif SYSCLK_FREQ == 80000000 494 for(
volatile int i = 0; i < 1072; i++)__NOP();
495 #elif SYSCLK_FREQ == 84000000 496 for(
volatile int i = 0; i < 1125; i++)__NOP();
497 #elif SYSCLK_FREQ == 168000000 498 for(
volatile int i = 0; i < 2250; i++)__NOP();
500 #error Implement delay function. 511 HAL_NVIC_EnableIRQ(BNRG_SPI_EXTI_IRQn);
521 HAL_NVIC_DisableIRQ(BNRG_SPI_EXTI_IRQn);
531 HAL_NVIC_ClearPendingIRQ(BNRG_SPI_EXTI_IRQn);
541 __HAL_GPIO_EXTI_CLEAR_IT(BNRG_SPI_EXTI_PIN);
static void us150Delay(void)
Utility function for delay.
void Disable_SPI_IRQ(void)
Disable SPI IRQ.
int32_t BlueNRG_SPI_Write(SPI_HandleTypeDef *hspi, uint8_t *data1, uint8_t *data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2)
Writes data from local buffer to SPI.
void set_irq_as_output(void)
Set in Output mode the IRQ.
void Clear_SPI_IRQ(void)
Clear Pending SPI IRQ.
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
This function is used for low level initialization of the SPI communication with the BlueNRG Expansio...
void Clear_SPI_EXTI_Flag(void)
Clear EXTI (External Interrupt) line for SPI IRQ.
void Enable_SPI_IRQ(void)
Enable SPI IRQ.
uint8_t BlueNRG_DataPresent(void)
Reports if the BlueNRG has data for the host micro.
void BlueNRG_HW_Bootloader(void)
Activate internal bootloader using pin.
void BNRG_SPI_Init(void)
Initializes the SPI communication with the BlueNRG Expansion Board.
void set_irq_as_input(void)
Set the IRQ in input mode.
int32_t BlueNRG_SPI_Read_All(SPI_HandleTypeDef *hspi, uint8_t *buffer, uint8_t buff_size)
Reads from BlueNRG SPI buffer and store data into local buffer.
This file contains definitions for the SensorTile_BlueNRG.c.
void Hal_Write_Serial(const void *data1, const void *data2, int32_t n_bytes1, int32_t n_bytes2)
Writes data to a serial interface.
void BlueNRG_RST(void)
Resets the BlueNRG.