First pass ar I2C
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Sat, 19 Oct 2013 16:44:47 +0000 (16:44 +0000)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Sat, 19 Oct 2013 16:44:47 +0000 (16:44 +0000)
git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@122 47cf9a05-e0a8-4ed5-9e9b-101a649bc004

12 files changed:
Makefile
lib/HAL_L3Gx.h
lib/HAL_LSM303DLHC.h
lib/LSM303DLHC/src/LSM303DLHC.c
lib/Makefile
lib/config.mk
lib/i2c.c
lib/i2c.h
lib/spi.c
lib/uart.c
lib/uart.h
multitouchglove.c

index dd278f7be20766cc4b10c7627296c1b98852542f..7a643c9786a01200f8bbaebd62140b6ee5700f53 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,9 @@ ROOTDIR = $(CURDIR)/uC-sdk
 export BOARD = inemo
 
 TARGET = multitouchglove.bin
-TARGET_OBJS = lib/spi.o lib/uart.o lib/HAL_L3Gx.o lib/L3Gx/src/L3Gx.o
+TARGET_OBJS = lib/spi.o lib/uart.o lib/i2c.o lib/HAL_L3Gx.o lib/L3Gx/src/L3Gx.o  lib/LSM303DLHC/src/LSM303DLHC.o
+
+#lib/HAL_LSM303DLHC.o
 
 LIBDEPS = uC-sdk/FreeRTOS/libFreeRTOS.a uC-sdk/arch/libarch.a uC-sdk/os/libos.a uC-sdk/libc/libc.a uC-sdk/libm/libm.a uC-sdk/acorn/libacorn.a
 LIBS = -Wl,--start-group $(LIBDEPS) -Wl,--end-group
index 3031843eacca3e34152d6deffd6e901b61588b38..b6b3dbc63f8ee730ca56b4eb763c28e11166b13d 100755 (executable)
@@ -1,3 +1,7 @@
+/*\r
+  Hardware Abstraction Layer for L3Gx gyroscopes\r
+*/\r
+\r
 #ifndef __HAL_L3GX__\r
 #define __HAL_L3GX__\r
 \r
index 530f543fd3a91af12fbaa339a8966e15ac241085..a623082bcab0c1332626e58013c0cd54532a1366 100755 (executable)
@@ -1,68 +1,17 @@
-/**\r
-  * @file    HAL_LSM303DLHC.h\r
-  * @author  ART Team IMS-Systems Lab\r
-  * @version V2.3.0\r
-  * @date    12 April 2012\r
-  * @brief   Hardware Abstraction Layer for LSM303DLHC.\r
-  * @details\r
-  *\r
-  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
-  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
-  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
-  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
-  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
-  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
-  *\r
-  * THIS SOURCE CODE IS PROTECTED BY A LICENSE.\r
-  * FOR MORE INFORMATION PLEASE CAREFULLY READ THE LICENSE AGREEMENT FILE LOCATED\r
-  * IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE.\r
-  *\r
-  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>\r
-  */\r
+/*\r
+  Hardware Abstraction Layer for LSM303DLHC accelerometer + magnetometer\r
+*/\r
 \r
-\r
-/* Define to prevent recursive inclusion*/\r
 #ifndef __HAL_LSM303DLHC_H\r
 #define __HAL_LSM303DLHC_H\r
 \r
-/* Includes */\r
 #include "stm32f10x.h"\r
 #include "i2c.h"\r
 \r
-\r
-#ifdef __cplusplus\r
- extern "C" {\r
-#endif\r
-\r
-/**\r
-* @addtogroup iNemo_Sensor_Drivers           iNemo Sensor Drivers\r
-* @{\r
-*/   \r
-   \r
-/**\r
- * @addtogroup HAL_LSM303DLHC      HAL LSM303DLHC\r
- * @brief This is an adapter header to join the platform indipendent @ref Sensor_Libraries for the LSM303DLHC 6 axis sensor\r
- *        to the low level driver on the microcontroller side.\r
- * @{\r
- */\r
-\r
-/**\r
- * @addtogroup  HAL_LSM303DLHC_Exported_Constants      HAL LSM303DLHC Exported Constants\r
- * @{\r
- */\r
-\r
-   \r
-#define LSM_I2C                  I2C2\r
    \r
+#define LSM_I2C                  I2C2   \r
 #define LSM_I2C_Speed            400000\r
 \r
-\r
-\r
-/**\r
- * @addtogroup HAL_LSM303DLHC_Interrupt_Pin_Define       HAL LSM303DLHC Interrupt Pin Define\r
- * @{\r
- */\r
-\r
 #define LSM_A_INT1_Pin           GPIO_Pin_2\r
 #define LSM_A_INT1_Port          GPIOD\r
 #define LSM_A_INT1_RCC_Port      RCC_APB2Periph_GPIOD\r
 #define LSM_A_INT2_Pin           GPIO_Pin_5\r
 #define LSM_A_INT2_Port          GPIOB\r
 #define LSM_A_INT2_RCC_Port      RCC_APB2Periph_GPIOB\r
-\r
-\r
-/** \r
- *@}\r
- */\r
-   \r
-/**\r
- *@}\r
- */\r
-\r
-/**\r
- * @addtogroup  HAL_LSM303DLHC_Exported_Macros       HAL LSM303DLHC Exported Macros\r
- * @{\r
- */\r
           \r
-#define Lsm303dlhcI2CInit()                                             iNemoI2C2Init(LSM_I2C_Speed)\r
-#define Lsm303dlhcI2CBufferRead(cDevAddress,pVal,cAddress,nBytes)       iNemoI2C2BufferRead(cDevAddress,pVal,cAddress,nBytes)\r
-#define Lsm303dlhcI2CBufferWrite(cDevAddress,pVal,cAddress,nBytes)      iNemoI2C2BufferWrite(cDevAddress,pVal,cAddress,nBytes)\r
-\r
-/**\r
- *@}\r
- */\r
+#define Lsm303dlhcI2CInit()                                             i2c_init(2, LSM_I2C_Speed)\r
+#define Lsm303dlhcI2CBufferRead(cDevAddress,pVal,cAddress,nBytes)       iNemoI2CBufferRead(cDevAddress,pVal,cAddress,nBytes)\r
+#define Lsm303dlhcI2CBufferWrite(cDevAddress,pVal,cAddress,nBytes)      iNemoI2CBufferWrite(cDevAddress,pVal,cAddress,nBytes)\r
 \r
-/**\r
- *@}\r
- */\r
-   \r
-/**\r
- *@}\r
- */\r
-\r
-#ifdef __cplusplus\r
-}\r
 #endif\r
-\r
-#endif\r
-\r
-/******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/\r
index d937956d68cfc688fa0ac9401fd9590924d2960d..3eff3de2d5bddc82b56e0d49a874b5ff92d8ad34 100755 (executable)
@@ -563,14 +563,16 @@ void Lsm303dlhcAccReadRawData(int16_t* pnRawData)
   /* check in the control register4 the data alignment*/\r
   if(!(ctrlx[0] & 0x40) || (ctrlx[1] & 0x40)) /* Little Endian Mode or FIFO mode */\r
   {\r
-    for(int i=0; i<3; i++)\r
+    int i;\r
+    for(i=0; i<3; i++)\r
     {\r
       pnRawData[i]=((int16_t)((uint16_t)buffer[2*i+1] << 8) + buffer[2*i])/cDivider;\r
     }\r
   }\r
   else /* Big Endian Mode */\r
   {\r
-    for(uint8_t i=0; i<3; i++)\r
+    uint8_t i;\r
+    for(i=0; i<3; i++)\r
       pnRawData[i]=((int16_t)((uint16_t)buffer[2*i] << 8) + buffer[2*i+1])/cDivider;\r
   }\r
 }\r
@@ -585,7 +587,7 @@ void Lsm303dlhcAccReadAcc(float* pfData)
 {\r
   int16_t buffer[3];\r
   uint8_t ctrlx[2];\r
-  float LSM_Acc_Sensitivity;\r
+  float LSM_Acc_Sensitivity = 0.0;\r
 \r
   /* Read the raw data */\r
   Lsm303dlhcAccReadRawData(buffer);\r
@@ -620,7 +622,8 @@ void Lsm303dlhcAccReadAcc(float* pfData)
   }\r
 \r
   /* Obtain the mg value for the three axis */\r
-  for(uint8_t i=0; i<3; i++)\r
+  uint8_t i;\r
+  for(i=0; i<3; i++)\r
   {\r
     pfData[i]=(float)buffer[i]/LSM_Acc_Sensitivity;\r
   }\r
@@ -645,7 +648,8 @@ void Lsm303dlhcAccReadAccFifo(int16_t* pnData, uint8_t cDataToRead)
   Lsm303dlhcAccI2CBufferRead(pcBuffer, LSM_A_OUT_X_L_REG_ADDR, cDataToRead*6);\r
 \r
   /* convert all data to signed int16 */\r
-  for(uint16_t i=0 ; i<cDataToRead*3 ; i++)\r
+  uint16_t i;\r
+  for(i=0 ; i<cDataToRead*3 ; i++)\r
   {\r
     pnData[i] = (int16_t)(((uint16_t)pcBuffer[j+1]<<8)+(uint16_t)pcBuffer[j])/16;\r
     j+=2;\r
@@ -1322,6 +1326,8 @@ float Lsm303dlhcMagGetDataRate(void)
     return 0.75;\r
   case LSM_ODR_1_5_HZ:\r
     return 1.5;\r
+  case LSM_ODR_3_0_HZ:\r
+    return 3.0;\r
   case LSM_ODR_7_5_HZ:\r
     return 7.5;\r
   case LSM_ODR_15_HZ:\r
@@ -1350,7 +1356,7 @@ void Lsm303dlhcMagReadMag(float* pfData)
 {\r
   uint8_t buffer[6];\r
   uint8_t CTRLB;\r
-  uint16_t LSM_Magn_Sensitivity_XY, LSM_Magn_Sensitivity_Z;\r
+  uint16_t LSM_Magn_Sensitivity_XY = 0.0, LSM_Magn_Sensitivity_Z = 0.0;\r
   uint8_t aux[2];\r
 \r
   Lsm303dlhcMagI2CByteRead(&CTRLB, LSM_M_CRB_REG_ADDR);\r
@@ -1399,7 +1405,8 @@ void Lsm303dlhcMagReadMag(float* pfData)
     break;\r
   }\r
 \r
-  for(int i=0; i<2; i++)\r
+  int i;\r
+  for(i=0; i<2; i++)\r
   {\r
     pfData[i]=(float)((int16_t)(((uint16_t)buffer[2*i] << 8) + buffer[2*i+1])*1000)/LSM_Magn_Sensitivity_XY;\r
   }\r
@@ -1432,7 +1439,8 @@ void Lsm303dlhcMagReadRawData(int16_t* pnRawData)
   buffer[4]=aux[0];\r
   buffer[5]=aux[1];\r
 \r
-  for(uint8_t i=0; i<3; i++)\r
+  uint8_t i;\r
+  for(i=0; i<3; i++)\r
       pnRawData[i]=(int16_t)(((uint16_t)buffer[2*i] << 8) + buffer[2*i+1]);\r
 }\r
 \r
index a2c591572f73cae6798abfbef18f56f4d00f48f8..8f07f079b2fdd3294959d2e4b668abbad6885ea6 100644 (file)
@@ -11,8 +11,9 @@ include $(ROOTDIR)/arch/config.mk
 include $(ROOTDIR)/FreeRTOS/config.mk
 #include ../uC-sdk/arch/config.mk
 
-TARGET_SRCS += spi.c
 TARGET_SRCS += uart.c
+TARGET_SRCS += spi.c
+TARGET_SRCS += i2c.c
 TARGET_SRCS += HAL_L3Gx.c
 #TARGET_SRCS += i2c.c
 #TARGET_SRCS = iNEMO_Compass/src/iNEMO_Compass.c
@@ -20,7 +21,7 @@ TARGET_SRCS += HAL_L3Gx.c
 #TARGET_SRCS += iNEMO_M1_SensorDrivers/src/iNemo_SPI_Driver.c
 TARGET_SRCS += L3Gx/src/L3Gx.c
 #TARGET_SRCS += LPS331AP/src/LPS331AP.c
-#TARGET_SRCS += LSM303DLHC/src/LSM303DLHC.c
+TARGET_SRCS += LSM303DLHC/src/LSM303DLHC.c
 #TARGET_SRCS += STMF1_VirtualCom/src/STM32F1_VC_Desc.c
 #TARGET_SRCS += STMF1_VirtualCom/src/STM32F1_VC_Endp.c
 #TARGET_SRCS += STMF1_VirtualCom/src/STM32F1_VC_General.c
index d8d72f211b80129678ee7583e91fa7d128899ab5..f48d5312eca4b3efe15d50eacc5f70e899f98f0b 100644 (file)
@@ -1,7 +1,5 @@
 TARGET_INCLUDES += $(MAINDIR)/lib
-TARGET_INCLUDES += $(MAINDIR)/lib/iNEMO_Compass/inc
 TARGET_INCLUDES += $(MAINDIR)/lib/L3Gx/inc
-TARGET_INCLUDES += $(MAINDIR)/lib/LPS331AP/inc
 TARGET_INCLUDES += $(MAINDIR)/lib/LSM303DLHC/inc
 
 ifeq ($(USE_MPU),true)
index d294c9079ac3aeb77576017b173433310ff983a6..6dcb8cdfb1123879132f2248a536c0f54bf8644b 100644 (file)
--- a/lib/i2c.c
+++ b/lib/i2c.c
@@ -1,9 +1,12 @@
 #include "i2c.h"
-#include "FreeRTOS.h"
+#include "task.h"
+#include <stm32f10x.h>
 #include <stm32f10x_gpio.h>
 #include <stm32f10x_rcc.h>
 #include <stm32f10x_i2c.h>
 
+#include <stdio.h>
+
 #define FORCE_CRITICAL_SEC
 
 #define I2C1_DR_Address               0x40005410
 
 #define DMA_BUFFER_SIZE       196
 
+struct i2cInitDef_t {
+    // scl / sda
+    I2C_TypeDef * id;
+    GPIO_TypeDef * tdef[2];
+    GPIO_InitTypeDef gpiodef[2];
+    // i2c / gpio
+    volatile uint32_t * bridge[2];
+    uint32_t peripheral[2];
+};
+
+static struct i2cInitDef_t i2cInitDefs[2] = {
+    { I2C1, { GPIOB, GPIOB}, {   // I2C1
+        { GPIO_Pin_6, GPIO_Speed_50MHz, GPIO_Mode_AF_OD },        // SCL
+        { GPIO_Pin_7, GPIO_Speed_50MHz, GPIO_Mode_AF_OD },        // SDA
+    }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_I2C1, RCC_APB2Periph_GPIOB } },
+    { I2C2, { GPIOB, GPIOB}, {   // I2C2
+        { GPIO_Pin_10, GPIO_Speed_50MHz, GPIO_Mode_AF_OD },       // SCL
+        { GPIO_Pin_11, GPIO_Speed_50MHz, GPIO_Mode_AF_OD },       // SDA
+    }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_I2C2, RCC_APB2Periph_GPIOB } },
+};
+
+
+
+
+
+
+
+void i2c_init(uint8_t id, uint32_t speed)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+
+    //clock AFIO
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
+
+    int i;
+    for (i = 0; i < 2; i++)
+        *(i2cInitDef->bridge[i]) |= i2cInitDef->peripheral[i];
+
+    for (i = 0; i < 2; i++)
+        GPIO_Init(i2cInitDef->tdef[i], &i2cInitDef->gpiodef[i]);
+
+    //Init SPI
+    I2C_InitTypeDef i2cdef;
+    i2cdef.I2C_Mode = I2C_Mode_I2C;
+    i2cdef.I2C_DutyCycle = I2C_DutyCycle_2;
+    i2cdef.I2C_OwnAddress1 = 0x00;
+    i2cdef.I2C_Ack = I2C_Ack_Enable;
+    i2cdef.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
+    i2cdef.I2C_ClockSpeed = speed;
+
+    I2C_Init(i2cInitDef->id, &i2cdef); 
+    I2C_Cmd(i2cInitDef->id, ENABLE);
+
+#if (defined(I2C1_USE_DMA_TX) || defined(I2C1_USE_DMA_RX) || defined(I2C2_USE_DMA_TX) || defined(I2C2_USE_DMA_RX))
+       i2c_dma_init(id);
+#endif 
+}
+
+void i2c_dma_init(uint8_t id)
+{
+
+}
+
+void uart_read_polling(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+void uart_write_polling(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+void uart_read_dma(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+void uart_write_dma(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+
+
+
+#if 0
+
+
 /**
  * @brief  Reads a block of data from the device by DMA.
  * @brief  I2C2: I2C peripherial to use.
@@ -143,7 +238,7 @@ void iNemoI2CBufferReadDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr,
 #endif
     
 }
-
+#endif
 
 /**
  * @brief  Reads a block of data from the device by polling.
@@ -154,7 +249,7 @@ void iNemoI2CBufferReadDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr,
  * @param  nNumByteToRead: number of bytes to read.
  * @retval None
  */
-void iNemoI2CBufferReadPolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead)
+void iNemoI2CBufferRead(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead)
 {
     /* Set the MSb of the register address in case of multiple readings */
     if(cNumByteToRead>1)
@@ -235,7 +330,7 @@ void iNemoI2CBufferReadPolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAd
   
 }
       
-
+#if 0
 /**
  * @brief  Writes a block of data to the device by DMA.
  * @brief  I2C2: I2C peripherial to use.
@@ -330,7 +425,7 @@ void iNemoI2CBufferWriteDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr
   while ((I2C2->CR1 & 0x0200) == 0x0200);
   
 }
-
+#endif
 
 /**
  * @brief  Writes a block of data to the device by polling.
@@ -341,7 +436,7 @@ void iNemoI2CBufferWriteDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr
  * @param  nNumByteToWrite : number of bytes to write.
  * @retval None
  */
-void iNemoI2CBufferWritePolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite)
+void iNemoI2CBufferWrite(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite)
 {   
     /* Set to 1 the MSb of the register address in case of multiple byte writing */
     if(cNumByteToWrite>1)
@@ -372,7 +467,8 @@ void iNemoI2CBufferWritePolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWrite
     /* Test on EV8 and clear it */
     while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
     
-    for(uint8_t i=0 ; i<cNumByteToWrite ; i++)
+    uint8_t i;
+    for(i=0 ; i<cNumByteToWrite ; i++)
     {
       /* Send the byte to be written */
       I2C_SendData(I2C2, pcBuffer[i]);
index e9dacb61e0ea889a1f6c9c65737bc8e284bf2ea5..efdf234cd5f7d89dd449375b8fba1a81ed402e2c 100644 (file)
--- a/lib/i2c.h
+++ b/lib/i2c.h
@@ -1,5 +1,20 @@
+#ifndef __I2C__
+#define __I2C__
 
-void iNemoI2CBufferReadDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
-void iNemoI2CBufferReadPolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
-void iNemoI2CBufferWriteDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
-void iNemoI2CBufferWritePolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
+#include "FreeRTOS.h"
+
+void i2c_init(uint8_t id, uint32_t speed);
+void i2c_dma_init(uint8_t id);
+
+void uart_read_polling(uint8_t id, uint8_t *buffer, uint8_t nb);
+void uart_write_polling(uint8_t id, uint8_t *buffer, uint8_t nb);
+
+void uart_read_dma(uint8_t id, uint8_t *buffer, uint8_t nb);
+void uart_write_dma(uint8_t id, uint8_t *buffer, uint8_t nb);
+
+//void iNemoI2CBufferReadDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
+void iNemoI2CBufferRead(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
+//void iNemoI2CBufferWriteDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
+void iNemoI2CBufferWrite(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
+
+#endif
\ No newline at end of file
index a21609aece8838b01a69b719724e289988ac6588..e74e7ce4430243435413280b01d08839b24e77a7 100644 (file)
--- a/lib/spi.c
+++ b/lib/spi.c
@@ -19,23 +19,23 @@ struct spiInitDef_t {
 
 static struct spiInitDef_t spiInitDefs[3] = {
     { SPI1, { GPIOA, GPIOA, GPIOA, GPIOA}, {   // SPI1
-        { GPIO_Pin_5 , GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // SCK
+        { GPIO_Pin_5, GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // SCK
         { GPIO_Pin_7, GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // MOSI
         { GPIO_Pin_6, GPIO_Speed_50MHz, GPIO_Mode_IN_FLOATING }, // MISO
-        { GPIO_Pin_4,   GPIO_Speed_50MHz, GPIO_Mode_Out_PP },      // CS
-    }, {&RCC->APB2ENR, &RCC->APB2ENR}, {RCC_APB2Periph_SPI1, RCC_APB2Periph_GPIOA} },
+        { GPIO_Pin_4, GPIO_Speed_50MHz, GPIO_Mode_Out_PP },      // CS
+    }, {&RCC->APB2ENR, &RCC->APB2ENR}, {RCC_APB2Periph_SPI1, RCC_APB2Periph_GPIOA } },
     { SPI2, { GPIOB, GPIOB, GPIOB, GPIOB}, {   // SPI2
-        { GPIO_Pin_13 , GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // SCK
+        { GPIO_Pin_13, GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // SCK
         { GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // MOSI
         { GPIO_Pin_14, GPIO_Speed_50MHz, GPIO_Mode_IN_FLOATING }, // MISO
-        { GPIO_Pin_12,   GPIO_Speed_50MHz, GPIO_Mode_Out_PP },      // CS
-    }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI2, RCC_APB2Periph_GPIOB}  },
+        { GPIO_Pin_12, GPIO_Speed_50MHz, GPIO_Mode_Out_PP },      // CS
+    }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI2, RCC_APB2Periph_GPIOB }  },
     { SPI3, { GPIOB, GPIOB, GPIOB, GPIOA}, {   // SPI3
-        { GPIO_Pin_3 , GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // SCK
+        { GPIO_Pin_3, GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // SCK
         { GPIO_Pin_5, GPIO_Speed_50MHz, GPIO_Mode_AF_PP },       // MOSI
         { GPIO_Pin_4, GPIO_Speed_50MHz, GPIO_Mode_IN_FLOATING }, // MISO
-        { GPIO_Pin_15,   GPIO_Speed_50MHz, GPIO_Mode_Out_PP },      // CS
-    }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI3, RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB },
+        { GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_Out_PP },     // CS
+    }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI3, RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB } },
 };
 
 void spi_init(uint8_t id)
index c7e74996cf0a2d63774f466f18db1d4735d359b2..b3b1778546228d0b7a55ca89461b2a5e4c4af7ce 100644 (file)
@@ -40,7 +40,7 @@ static struct uartInitDef_t uartInitDefs[5] = {
     }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_UART5, RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD } },
 };
 
-void uart_init(uint8_t id)
+void uart_init(uint8_t id, uint32_t baudrate)
 {
     if (!((id >= 1) && (id <= 3)))
         return;
@@ -59,7 +59,7 @@ void uart_init(uint8_t id)
 
     USART_InitTypeDef usartdef;
 
-    usartdef.USART_BaudRate = 115200;
+    usartdef.USART_BaudRate = baudrate;
     usartdef.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
     usartdef.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
     usartdef.USART_WordLength = USART_WordLength_8b;
@@ -75,6 +75,16 @@ void uart_init(uint8_t id)
     USART_Cmd(uartInitDef->id, ENABLE);
 }
 
+void uart_deinit(uint8_t id)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct uartInitDef_t * uartInitDef = uartInitDefs + id - 1;
+
+    USART_DeInit(uartInitDef->id);
+}
+
 void uart_send_char(uint8_t id, uint8_t c)
 {
     if (!((id >= 1) && (id <= 3)))
index d83e5866cebe4b29d744d223bba1fab2ebcb16d5..405523737382f26eefb430279a956380883b5600 100644 (file)
@@ -3,7 +3,8 @@
 
 #include "FreeRTOS.h"
 
-void uart_init(uint8_t id);
+void uart_init(uint8_t id, uint32_t baudrate);
+void uart_deinit(uint8_t id);
 
 void uart_send_char(uint8_t id, uint8_t c);
 uint8_t uart_receive_char(uint8_t id);
index 8691fa5a888c3d602a50cb20fc56b5686158e187..7a6c34ebd3d0b762072bf17c07a59c69904768c8 100644 (file)
 #include <stm32f10x_i2c.h>
 
 #include <spi.h>
+#include <i2c.h>
 #include <L3Gx.h>
+#include <LSM303DLHC.h>
 
+#define LEDS
+#define GYRO
+#define ACCELERO
 
+#ifdef LEDS
 void initLed()
 {
     //set Pin22 (PA4) to output mode
@@ -23,20 +29,45 @@ void initLed()
     GPIO_Init(GPIOA, &pin22def);
 }
 
+
+void setLed()
+{
+    GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
+}
+
+void resetLed()
+{
+    GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
+}
+
+static void blinkerTask(void *p) 
+{
+    printf("Start blinker task\n");
+    while (1) 
+    {
+        setLed();
+        vTaskDelay(1357);
+        resetLed(); 
+        vTaskDelay(1357);
+    }
+}
+#endif
+
+#ifdef GYRO
 void initGyro()
 {
-    L3GInit L3GInitStructure;
+    L3GInit gyrodef;
 
     /* Fill the gyro structure */
-    L3GInitStructure.xPowerMode = L3G_NORMAL_SLEEP_MODE;
-    L3GInitStructure.xOutputDataRate = L3G_ODR_190_HZ_CUTOFF_12_5;
-    L3GInitStructure.xEnabledAxes = L3G_ALL_AXES_EN;
-    L3GInitStructure.xFullScale = L3G_FS_500_DPS;
-    L3GInitStructure.xDataUpdate = L3G_BLOCK_UPDATE;
-    L3GInitStructure.xEndianness = L3G_BIG_ENDIAN;
+    gyrodef.xPowerMode = L3G_NORMAL_SLEEP_MODE;
+    gyrodef.xOutputDataRate = L3G_ODR_190_HZ_CUTOFF_12_5;
+    gyrodef.xEnabledAxes = L3G_ALL_AXES_EN;
+    gyrodef.xFullScale = L3G_FS_500_DPS;
+    gyrodef.xDataUpdate = L3G_BLOCK_UPDATE;
+    gyrodef.xEndianness = L3G_BIG_ENDIAN;
 
     /* Configure the gyro main parameters */
-    L3gd20Config(&L3GInitStructure);
+    L3gd20Config(&gyrodef);
 }
 
 void getGyroInfo()
@@ -53,62 +84,86 @@ void getGyroInfo()
     printf("Endianness: %02x\n", L3GInitStructure.xEndianness);
 }
 
-void setLed()
+static void gyroTask(void *p) 
 {
-    GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
+    printf("Start gyro task\n");
+    float *values = (float *) malloc(3 * sizeof(float));
+    if (values == NULL)
+        return;
+    while (1) 
+    {
+         L3gxReadAngRate(values);
+         printf("Gyro: x=%.4f y=%.4f z=%.4f\n", values[0], values[1], values[2]);
+         vTaskDelay(1000);
+    }
+    free(values);
 }
+#endif
 
-void resetLed()
+#ifdef ACCELERO
+void initAccelero()
 {
-    GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
-}
+    LSMAccInit accelerodef;
 
-static void blinkerTask(void *p) 
-{
-    printf("Start blinker task\n");
-    while (1) 
-    {
-        setLed();
-        vTaskDelay(1357);
-        resetLed(); 
-        vTaskDelay(1357);
-    }
+    /* Fill the gyro structure */
+    accelerodef.xPowerMode = LSM_NORMAL_MODE;
+    accelerodef.xOutputDataRate = LSM_ODR_400_HZ;
+    accelerodef.xEnabledAxes = LSM_ALL_AXES_EN;
+    accelerodef.xFullScale = LSM_FS_2G;
+    accelerodef.xDataUpdate = LSM_CONTINUOS_UPDATE;
+    accelerodef.xEndianness = LSM_BIG_ENDIAN;
+    accelerodef.xHighResolution = LSM_ENABLE;
+
+    /* Configure the gyro main parameters */
+    Lsm303dlhcAccConfig(&accelerodef);
 }
 
-static void gyroTask(void *p) 
+static void acceleroTask(void *p) 
 {
-    printf("Start gyro task\n");
+    printf("Start accelero task\n");
     float *values = (float *) malloc(3 * sizeof(float));
     if (values == NULL)
         return;
     while (1) 
     {
-         L3gxReadAngRate(values);
-         printf("x=%.4f y=%.4f z=%.4f\n", values[0], values[1], values[2]);
+         Lsm303dlhcAccReadAcc(values);
+         printf("Accelero: x=%.4f y=%.4f z=%.4f\n", values[0], values[1], values[2]);
          vTaskDelay(1000);
     }
     free(values);
 }
+#endif
 
 int main() 
 {
     init_malloc_wrapper();
+
+
+#ifdef LEDS
     printf("Init led\n");
     initLed();
+    printf("Start blinkerTask\n");
+    xTaskCreate(blinkerTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+#endif
+
+#ifdef GYRO
     printf("Init SPI 2\n");
     spi_init(2);
+    getGyroInfo();
     printf("Init Gyro\n");
     initGyro();
-
-    getGyroInfo();
-
-    printf("Start blinkerTask\n");
-    //start a task
-    xTaskCreate(blinkerTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
-
     printf("Start gyroTask\n");
-    //start a task
     xTaskCreate(gyroTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+#endif
+
+#ifdef ACCELERO
+    printf("Init I2C2 2\n");
+    i2c_init(2, 400000);
+    printf("Init Accelero\n");
+    initAccelero();
+    printf("Start acceleroTask\n");
+    xTaskCreate(acceleroTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+#endif
 
     //start task scheduler
     vTaskStartScheduler();