MAV'RIC
/home/travis/build/lis-epfl/MAVRIC_Library/hal/stm32/i2c_stm32.hpp
00001 /*******************************************************************************
00002  * Copyright (c) 2009-2016, MAV'RIC Development Team
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  * 1. Redistributions of source code must retain the above copyright notice,
00009  * this list of conditions and the following disclaimer.
00010  *
00011  * 2. Redistributions in binary form must reproduce the above copyright notice,
00012  * this list of conditions and the following disclaimer in the documentation
00013  * and/or other materials provided with the distribution.
00014  *
00015  * 3. Neither the name of the copyright holder nor the names of its contributors
00016  * may be used to endorse or promote products derived from this software without
00017  * specific prior written permission.
00018  *
00019  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00020  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00021  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00022  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00023  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00024  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00025  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00026  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00027  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00028  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00029  * POSSIBILITY OF SUCH DAMAGE.
00030  ******************************************************************************/
00031 
00032 /*******************************************************************************
00033  * \file i2c_stm32.hpp
00034  *
00035  * \author MAV'RIC Team
00036  * \author Gregoire HEITZ
00037  *
00038  * \brief I2C peripheral driver for STM32
00039  *
00040  ******************************************************************************/
00041 
00042 #ifndef I2C_STM32_HPP_
00043 #define I2C_STM32_HPP_
00044 
00045 #include "hal/common/i2c.hpp"
00046 #include "hal/stm32/gpio_stm32.hpp"
00047 
00048 extern "C"
00049 {
00050     #include <libopencm3/stm32/i2c.h>
00051     #include <libopencm3/stm32/rcc.h>
00052 }
00053 
00054 
00058 typedef enum
00059 {
00060     STM32_I2C1 = I2C1,
00061     STM32_I2C2 = I2C2,
00062     STM32_I2C3 = I2C3
00063 } i2c_stm32_devices_t;
00064 
00065 
00069 typedef struct
00070 {
00071     i2c_stm32_devices_t i2c_device_config;      
00072     bool                tenbit_config;          
00073     gpio_stm32_conf_t   sda_config;             
00074     gpio_stm32_conf_t   clk_config;             
00075     rcc_periph_clken    rcc_i2c_config;         
00076     rcc_periph_clken    rcc_sda_port_config;    
00077     rcc_periph_clken    rcc_clk_port_config;    
00078     uint32_t            clk_speed;              
00079     uint16_t            timeout;                
00080 } i2c_stm32_conf_t;
00081 
00087 static inline  i2c_stm32_conf_t i2c_stm32_default_config();
00088 
00092 class I2c_stm32: public I2c
00093 {
00094 public:
00100     I2c_stm32(i2c_stm32_conf_t config = i2c_stm32_default_config());
00101 
00102 
00109     bool init(void);
00110 
00111 
00120     bool probe(uint32_t address);
00121 
00122 
00133     bool write(const uint8_t* buffer, uint32_t nbytes, uint32_t address);
00134 
00135 
00146     bool read(uint8_t* buffer, uint32_t nbytes, uint32_t address);
00147 
00148 
00149 private:
00150     i2c_stm32_conf_t        config_;        
00151     i2c_stm32_devices_t     i2c_;           
00152     uint16_t                i2c_timeout_;   
00153 
00162     bool check_event(uint32_t i2c_event);
00163 
00173     bool start(uint8_t address, bool direction_is_transmit, bool ack);
00174 
00182     bool stop(void);
00183 
00189     uint8_t read_ack(void);
00190 
00196     uint8_t read_nack(void);
00197 };
00198 
00199 static inline  i2c_stm32_conf_t i2c_stm32_default_config()
00200 {
00201     i2c_stm32_conf_t conf = {};
00202     conf.i2c_device_config  = STM32_I2C2;
00203     conf.rcc_i2c_config     = RCC_I2C2;
00204     conf.rcc_sda_port_config     = RCC_GPIOB;
00205     conf.sda_config.port    = GPIO_STM32_PORT_B;
00206     conf.sda_config.pin     = GPIO_STM32_PIN_11;
00207     conf.sda_config.alt_fct = GPIO_STM32_AF_4;
00208     conf.rcc_clk_port_config     = RCC_GPIOB;
00209     conf.clk_config.port    = GPIO_STM32_PORT_B;
00210     conf.clk_config.pin     = GPIO_STM32_PIN_10;
00211     conf.clk_config.alt_fct = GPIO_STM32_AF_4;
00212     conf.clk_speed          = 100000;
00213     conf.tenbit_config      = false;  // currently only support 8 bits addressing
00214     conf.timeout            = 20000;
00215     return conf;
00216 }
00217 
00218 
00219 #endif /* I2C_STM32_HPP_ */
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Defines