paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [5279] adding checksum to SPI coms between STM32 and


From: antoine drouin
Subject: [paparazzi-commits] [5279] adding checksum to SPI coms between STM32 and overo
Date: Mon, 09 Aug 2010 19:08:53 +0000

Revision: 5279
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=5279
Author:   poine
Date:     2010-08-09 19:08:47 +0000 (Mon, 09 Aug 2010)
Log Message:
-----------
adding checksum to SPI coms between STM32 and overo

Added Paths:
-----------
    paparazzi3/trunk/sw/airborne/lisa/arch/stm32/lisa_overo_link_crc_arch.c

Added: paparazzi3/trunk/sw/airborne/lisa/arch/stm32/lisa_overo_link_crc_arch.c
===================================================================
--- paparazzi3/trunk/sw/airborne/lisa/arch/stm32/lisa_overo_link_crc_arch.c     
                        (rev 0)
+++ paparazzi3/trunk/sw/airborne/lisa/arch/stm32/lisa_overo_link_crc_arch.c     
2010-08-09 19:08:47 UTC (rev 5279)
@@ -0,0 +1,131 @@
+#include "lisa/lisa_overo_link_crc.h"
+#include "led.h"
+
+#include <stm32/rcc.h>
+#include <stm32/gpio.h>
+#include <stm32/flash.h>
+#include <stm32/misc.h>
+#include <stm32/spi.h>
+#include <stm32/dma.h>
+
+#include "my_debug_servo.h"
+
+void (* overo_link_handler)(void);
+
+void dma1_c2_irq_handler(void);
+
+void overo_link_arch_init(void) {
+
+  overo_link_handler = NULL; 
+
+  /* Enable SPI_1 DMA clock 
---------------------------------------------------*/
+  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
+  /* Enable SPI1 Periph clock 
-------------------------------------------------*/
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
+  /* Configure GPIOs: NSS, SCK, MISO and MOSI  
--------------------------------*/
+  GPIO_InitTypeDef GPIO_InitStructure;
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | 
GPIO_Pin_7;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+  GPIO_Init(GPIOA, &GPIO_InitStructure);
+  /* SPI_SLAVE configuration 
--------------------------------------------------*/
+  SPI_InitTypeDef SPI_InitStructure;
+  SPI_InitStructure.SPI_Direction         = SPI_Direction_2Lines_FullDuplex;
+  SPI_InitStructure.SPI_Mode              = SPI_Mode_Slave;
+  SPI_InitStructure.SPI_DataSize          = SPI_DataSize_8b;
+  SPI_InitStructure.SPI_CPOL              = SPI_CPOL_Low;
+  SPI_InitStructure.SPI_CPHA              = SPI_CPHA_2Edge;
+  SPI_InitStructure.SPI_NSS               = SPI_NSS_Hard; 
+  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
+  SPI_InitStructure.SPI_FirstBit          = SPI_FirstBit_MSB;
+  SPI_InitStructure.SPI_CRCPolynomial     = 0x31; /* fuchsto: was 7 (reset) */
+  SPI_Init(SPI1, &SPI_InitStructure);
+
+  SPI_CalculateCRC(SPI1, ENABLE); 
+
+  /* Enable SPI_SLAVE */
+  SPI_Cmd(SPI1, DISABLE);
+  SPI_Cmd(SPI1, ENABLE);
+
+  /* Configure DMA1 channel2 IRQ Channel */
+  NVIC_InitTypeDef NVIC_init_struct = {
+    .NVIC_IRQChannel = DMA1_Channel2_IRQn,
+    .NVIC_IRQChannelPreemptionPriority = 0,
+    .NVIC_IRQChannelSubPriority = 0,
+    .NVIC_IRQChannelCmd = ENABLE
+  };
+  NVIC_Init(&NVIC_init_struct);
+
+  /* setup DMA for first transfert */
+  overo_link_arch_prepare_next_transfert(1);
+
+}
+
+
+void overo_link_arch_prepare_next_transfert(unsigned char init) {
+  
+
+  /* SPI_SLAVE_Rx_DMA_Channel configuration 
------------------------------------*/
+  DMA_InitTypeDef DMA_InitStructure;
+  DMA_DeInit(DMA1_Channel2);
+  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(SPI1_BASE+0x0C);
+  DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)overo_link.down.array;
+  DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;
+  DMA_InitStructure.DMA_BufferSize         = sizeof(union AutopilotMessage);
+  DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
+  DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
+  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
+  DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
+  DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
+  DMA_InitStructure.DMA_Priority           = DMA_Priority_VeryHigh;
+  DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
+  DMA_Init(DMA1_Channel2, &DMA_InitStructure);
+
+  /* SPI_SLAVE_Tx_DMA_Channel configuration 
------------------------------------*/
+  DMA_DeInit(DMA1_Channel3);
+  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(SPI1_BASE+0x0C);
+  DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)overo_link.up.array;
+  DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST; 
+  DMA_InitStructure.DMA_BufferSize         = sizeof(union AutopilotMessage);
+  DMA_InitStructure.DMA_Priority           = DMA_Priority_Medium;
+  
+  DMA_Init(DMA1_Channel3, &DMA_InitStructure);
+  
+  /* Enable SPI_1 Rx request */
+  SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
+  /* Enable SPI_1 Rx request */
+  SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
+  /* Enable DMA1 Channel3 */
+  
+  DMA_Cmd(DMA1_Channel3, ENABLE);
+  /* Enable DMA1 Channel2 */
+  DMA_Cmd(DMA1_Channel2, ENABLE);
+
+  /* Enable DMA1 Channel2 Transfer Complete interrupt */
+  DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
+
+  SPI_Cmd(SPI1, DISABLE); 
+  SPI_CalculateCRC(SPI1, DISABLE); 
+  SPI_CalculateCRC(SPI1, ENABLE); 
+  SPI_Cmd(SPI1, ENABLE);
+
+}
+
+void dma1_c2_irq_handler(void) {
+  DEBUG_S2_ON(); 
+
+  DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, DISABLE);
+
+  overo_link.status = DATA_AVAILABLE;
+
+  //    overo_link.status = DATA_AVAILABLE;
+  //  else
+  //    overo_link.status = CRC_ERROR;
+
+  DEBUG_S2_OFF(); 
+
+  
+}
+
+
+




reply via email to

[Prev in Thread] Current Thread [Next in Thread]