Here, alternative functions and classes for STM32. The program contains a class for the I2C software bus, a class for working with a watchdog timer and time delay functions based on DWT. All functions and classes use the HAL library. Functions and classes were written for the microcontroller stm32f103.

Dependents:   STM32_F1XX_Alternative

AlternativeSoftwareI2C.cpp

Committer:
Yar
Date:
2017-05-24
Revision:
1:0d39ea4dee8b
Parent:
0:2f819bf6cd99

File content as of revision 1:0d39ea4dee8b:

#include "AlternativeSoftwareI2C.hpp"
#include "stm32f1xx_hal.h"

#include "AlternativeDelay.hpp"
#include "mbed.h"

#define _delay_us delay_us 


SoftwareI2C::SoftwareI2C(GPIO_TypeDef* GPIOx_SCL, GPIO_TypeDef* GPIOx_SDA, uint16_t GPIO_PinScl, uint16_t GPIO_PinSda) {
    pinSDA = GPIO_PinSda;
    pinSCL = GPIO_PinScl;
    I2C_SDA_PORT = GPIOx_SDA;
    I2C_SCL_PORT = GPIOx_SCL;
    GPIO_InitTypeDef _GPIO_Init;
    __GPIOC_CLK_ENABLE();
    _GPIO_Init.Mode = GPIO_MODE_OUTPUT_OD; 
    _GPIO_Init.Pull = GPIO_NOPULL;
    _GPIO_Init.Pin = pinSDA | pinSCL;
    _GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH; 
    HAL_GPIO_Init(I2C_SCL_PORT, &_GPIO_Init);
    I2C_SDA_PORT->BSRR = pinSDA;//(1<<pinSDA);
    I2C_SCL_PORT->BSRR = pinSCL;//(1<<pinSCL);
    TimeX = 10; // Set 100 kBit/s
    initializeTimeDelays();
}

void SoftwareI2C::start(void) {
    I2C_SDA_PORT->BSRR = pinSDA;//(1<<I2C_SDA_PIN);
    _delay_us(TimeX);
    I2C_SCL_PORT->BSRR = pinSCL;//(1<<I2C_SCL_PIN);
    _delay_us(TimeX);
    while(!(I2C_SDA_PORT->IDR & pinSDA)) {
        I2C_SCL_PORT->BRR  = pinSCL;
        _delay_us(TimeX);
        I2C_SCL_PORT->BSRR = pinSCL;
        _delay_us(TimeX);
    }
    I2C_SDA_PORT->BRR = pinSDA;
    _delay_us(TimeX);
    I2C_SCL_PORT->BRR = pinSCL;
    _delay_us(TimeX);
}


void SoftwareI2C::stop(void) {
    I2C_SDA_PORT->BRR = pinSDA;
    _delay_us(TimeX);
    I2C_SCL_PORT->BSRR = pinSCL;
    _delay_us(TimeX);
    I2C_SDA_PORT->BSRR = pinSDA;
    _delay_us(TimeX);
}

uint8_t SoftwareI2C::write(uint8_t data) {
    uint8_t i;
    uint8_t ACK;
    for(i=0;i<8;i++) {
        if(data & 0x80) {
            I2C_SDA_PORT->BSRR = pinSDA;
        } else {
            I2C_SDA_PORT->BRR = pinSDA;
        }
        _delay_us(TimeX);
        I2C_SCL_PORT->BSRR = pinSCL;
        _delay_us(TimeX);        
        I2C_SCL_PORT->BRR = pinSCL;
        data=data<<1;    
    }
    _delay_us(TimeX);        
    I2C_SCL_PORT->BSRR = pinSCL;
    _delay_us(TimeX);        
    ACK = !(I2C_SDA_PORT->IDR & pinSDA);
    I2C_SCL_PORT->BRR = pinSCL;
    I2C_SDA_PORT->BRR = pinSDA;
    return ACK;
}

void SoftwareI2C::write(uint8_t address, uint8_t* data, uint8_t length) {
    uint8_t i ;
    start();
    write(address << 1);
    for(i = 0; i < length; i++) {
        write(data[i]);   
    }
    stop(); 
}

#if(0)
void SoftwareI2C::_delay_us(unsigned long delay) {
    volatile unsigned long i;
    for (i=0;i<delay;i++) {
        i++;
        i--;
    }
}
#endif