diff --git a/ked/CMakeLists.txt b/ked/CMakeLists.txt index 3a4e3c3..15ed03f 100644 --- a/ked/CMakeLists.txt +++ b/ked/CMakeLists.txt @@ -24,7 +24,7 @@ set(EXECUTABLE ${PROJECT_NAME}) #Create the executable #################################################################################################### set(INTERFACES_DIR ${CMAKE_SOURCE_DIR}/csl/interfaces) set(UTILS_DIR ${CMAKE_SOURCE_DIR}/utils/assert) -set(DRIVERS_DIR ${CMAKE_DRIVERS_DIR}/drivers) +set(DRIVERS_DIR ${CMAKE_SOURCE_DIR}/drivers) #################################################################################################### #SUBDIRECTORIES Will add the given folders to the porject an check for CmakeLists.txt @@ -40,6 +40,7 @@ message("${Blue} |--> Compiler Def\t: ${COMPILER_DEFS} ${ColourReset}") message("${Blue} |--> Project Def\t: ${PROJECT_DEFS} ${ColourReset}") message("${Blue} |--> Interfaces Dir\t: ${INTERFACES_DIR} ${ColourReset}") message("${Blue} |--> Libs used\t\t: ${EXTRA_LIBS} ${ColourReset}") +message("${Blue} |--> Drivers used\t\t: ${DRIVERS_DIR} ${ColourReset}") #################################################################################################### #EXECUTABLE diff --git a/ked/csl/interfaces/i2c.h b/ked/csl/interfaces/i2c.h index 7e1999d..688b84d 100755 --- a/ked/csl/interfaces/i2c.h +++ b/ked/csl/interfaces/i2c.h @@ -33,6 +33,8 @@ extern "C" { #include "hardwareDescription.h" #include "pin.h" +#define I2C_BASE ((I2C_TypeDef*)i2cBase_Addr_List[i2cHardware->channelNo]) + uint32_t i2cCR1; uint32_t i2cCR2; uint32_t i2cISR; @@ -145,7 +147,18 @@ typedef struct i2c_t * @brief Initilize the I2C Hardware * @param i2cHardware is the beforehand declared i2c channel with his opperation modes */ -void i2cInit(i2c_t *i2cHardware); +void i2cInit( i2c_t *i2cHardware, /*!< Pointer to I2C hardware Object */ + i2cCh_t channelNo, /*!< The harware channel to be used */ + i2cMode_t mode, /*!< Master, Slave or Multymaster Modes */ + uint16_t address, /*!< First and Main address of the device */ + uint16_t addressSecond, /*!< Second address if dual addresse mode is configured */ + i2cAddressCount_t addressCount, /*!< Single or multiple */ + i2cAddressSize_t addressSize, /*!< 10 or 7 bit address size */ + i2cSpeed_t speed, /*!< Bus Speed */ + i2cOpperationMode_t opperationMode, /*!< Blocking or non blocking polling, Int or DMA */ + i2cClockStreching_t streching, /*!< Clock Streching enable onyl in slave mode */ + i2cWakeUpTypes_t wakeOn /*!< Wake up condition */ + ); /** * @brief De-Initilize the I2C Hardware @@ -256,7 +269,7 @@ void i2cRead(i2c_t *i2cHardware, uint16_t *devAddress, uint8_t *registerAddress, * @param registerAddress is the regiter to be red from the device * @param data is the data whic has been red */ -uint8_t i2cMasterRecieve(i2c_t *i2cHardware, uint8_t devAddress, uint8_t registerAddress, uint8_t *data); +void i2cMasterRecieve(i2c_t *i2cHardware, uint8_t devAddress, uint8_t registerAddress, uint8_t *data); /** * @brief Sends a Single Byte as master to the given devices register. * this function will adapt himself to the selected oppeartion mode (Polling / Int / DMA) @@ -293,7 +306,6 @@ void i2cSlaveSend(i2c_t *i2cHardware, uint16_t *devAddress, uint8_t *registerAdd */ void i2cSendStart(i2c_t *i2cHardware); - /************************************************************************************************** I2C Communication functions Polling / Blocking Mode ***************************************************************************************************/ @@ -345,7 +357,7 @@ void i2cBusClear(); // I2C Standart : in case if SCL is stuck /************************************************************************************************** - I2C Extra functions that are mot etential for the main functionality + I2C Extra functions that are not esential for the main functionality ***************************************************************************************************/ /** diff --git a/ked/csl/stm32f042/Src/CMakeLists.txt b/ked/csl/stm32f042/Src/CMakeLists.txt index 92f99a4..e94b4f7 100644 --- a/ked/csl/stm32f042/Src/CMakeLists.txt +++ b/ked/csl/stm32f042/Src/CMakeLists.txt @@ -35,8 +35,8 @@ target_compile_definitions(stmSPI PRIVATE ${C_DEFS}) target_include_directories(stmSPI PUBLIC ${INTERFACES_DIR} ${CSL_INCLUDES}) add_library(sub::spi ALIAS stmSPI) -add_library(stmI2C i2c.c) +add_library(stmI2C imp_i2c.c) target_compile_options(stmI2C PRIVATE ${C_FLAGS}) target_compile_definitions(stmI2C PRIVATE ${C_DEFS}) target_include_directories(stmI2C PUBLIC ${INTERFACES_DIR} ${CSL_INCLUDES}) -add_library(sub::i2c ALIAS stmI2C) +add_library(sub::imp_i2c ALIAS stmI2C) diff --git a/ked/csl/stm32f042/Src/imp_i2c.c b/ked/csl/stm32f042/Src/imp_i2c.c new file mode 100644 index 0000000..d37b25b --- /dev/null +++ b/ked/csl/stm32f042/Src/imp_i2c.c @@ -0,0 +1,30 @@ +/** + ************************************************************************************************** + * @file i2c.c + * @author Kerem Yollu & Edwin Koch + * @date 18.07.2022 + * @version 1.0 + ************************************************************************************************** + * @brief I2C communitation based on the Standart I2C Protocol V7 Defined by NXP/Philips : + * following third Party Protocols based on I2C Bus are not going to be implemented : C-BUS SMBUS PMBUS IPMI DDC ATCA + * This will also not have a I3C support for the forseable futrue. This code is generated for the stm32f4xK6 series of mcu for stm + * + * **Detailed Description :** + * + * I2C communitation based on the Standart I2C Protocol V7 Defined by NXP/Philips : + * following third Party Protocols based on I2C Bus are not going to be implemented : C-BUS SMBUS PMBUS IPMI DDC ATCA + * This will also not have a I3C support for the forseable futrue. + * + * @todo + * - 18.07.2021 : Implement the i2c.c + ************************************************************************************************** +*/ + +#include "i2c.h" + +void i2cReset(i2c_t *i2cHardware) +{ + RCC->APB1RSTR |= (1 << i2cBus_Rst_bitPos[i2cHardware->channelNo]); + RCC->APB1RSTR &= ~(1 << i2cBus_Rst_bitPos[i2cHardware->channelNo]); +} + diff --git a/ked/csl/stm32f042/config.cmake b/ked/csl/stm32f042/config.cmake index d78ecc5..4dc7ccf 100644 --- a/ked/csl/stm32f042/config.cmake +++ b/ked/csl/stm32f042/config.cmake @@ -79,3 +79,4 @@ list(APPEND EXTRA_LIBS sub::timer) list(APPEND EXTRA_LIBS sub::init) list(APPEND EXTRA_LIBS sub::spi) list(APPEND EXTRA_LIBS sub::i2c) +list(APPEND EXTRA_LIBS sub::imp_i2c) diff --git a/ked/drivers/CMakeLists.txt b/ked/drivers/CMakeLists.txt index 5d23225..43b024e 100644 --- a/ked/drivers/CMakeLists.txt +++ b/ked/drivers/CMakeLists.txt @@ -1 +1,5 @@ -# add_subdirectory(${CSL_USED}) +add_library(I2C i2c.c) +target_compile_options(I2C PRIVATE ${C_FLAGS}) +target_compile_definitions(I2C PRIVATE ${C_DEFS}) +target_include_directories(I2C PUBLIC ${INTERFACES_DIR} ${CSL_INCLUDES}) +add_library(sub::i2c ALIAS I2C) diff --git a/ked/csl/stm32f042/Src/i2c.c b/ked/drivers/i2c.c similarity index 61% rename from ked/csl/stm32f042/Src/i2c.c rename to ked/drivers/i2c.c index 6a130ad..237c74f 100644 --- a/ked/csl/stm32f042/Src/i2c.c +++ b/ked/drivers/i2c.c @@ -1,30 +1,19 @@ -/** - ************************************************************************************************** - * @file i2c.c - * @author Kerem Yollu & Edwin Koch - * @date 18.07.2022 - * @version 1.0 - ************************************************************************************************** - * @brief I2C communitation based on the Standart I2C Protocol V7 Defined by NXP/Philips : - * following third Party Protocols based on I2C Bus are not going to be implemented : C-BUS SMBUS PMBUS IPMI DDC ATCA - * This will also not have a I3C support for the forseable futrue. This code is generated for the stm32f4xK6 series of mcu for stm - * - * **Detailed Description :** - * - * I2C communitation based on the Standart I2C Protocol V7 Defined by NXP/Philips : - * following third Party Protocols based on I2C Bus are not going to be implemented : C-BUS SMBUS PMBUS IPMI DDC ATCA - * This will also not have a I3C support for the forseable futrue. - * - * @todo - * - 18.07.2021 : Implement the i2c.c - ************************************************************************************************** -*/ - #include "i2c.h" -#define I2C_BASE ((I2C_TypeDef*)i2cBase_Addr_List[i2cHardware->channelNo]) -void i2cInit(i2c_t *i2cHardware) +void i2cInit( i2c_t *i2cHardware, /*!< Pointer to I2C hardware Object */ + i2cCh_t channelNo, /*!< The harware channel to be used */ + i2cMode_t mode, /*!< Master, Slave or Multymaster Modes */ + uint16_t address, /*!< First and Main address of the device */ + uint16_t addressSecond, /*!< Second address if dual addresse mode is configured */ + i2cAddressCount_t addressCount, /*!< Single or multiple */ + i2cAddressSize_t addressSize, /*!< 10 or 7 bit address size */ + i2cSpeed_t speed, /*!< Bus Speed */ + i2cOpperationMode_t opperationMode, /*!< Blocking or non blocking polling, Int or DMA */ + i2cClockStreching_t streching, /*!< Clock Streching enable onyl in slave mode */ + i2cWakeUpTypes_t wakeOn /*!< Wake up condition */ + ) { + i2cReset(i2cHardware); // Enables the i2c bus @@ -34,16 +23,16 @@ void i2cInit(i2c_t *i2cHardware) I2C_BASE->CR1 &= ~I2C_CR1_PE; //Configure analog filter. Anlalog filter is on - I2C_BASE->CR1 |= I2C_CR1_ANFOFF; + I2C_BASE->CR1 &= ~I2C_CR1_ANFOFF; //Configure NoStrech Streching mode is disabled (slave only) - //I2C_BASE->CR1 |= I2C_CR1_NOSTRETCH; + I2C_BASE->CR1 |= I2C_CR1_NOSTRETCH; //Configure the clock I2C_BASE->TIMINGR = i2cHardware->timing; - //Automatic end mode (master mode) Enablede as default - //I2C_BASE->CR2 &= ~I2C_CR2_AUTOEND; + //Automatic end mode (master mode) disabled Enablede as default + I2C_BASE->CR2 &= ~I2C_CR2_AUTOEND; //I2C_BASE->CR2 |= I2C_CR2_AUTOEND; if(i2cHardware->mode == i2cModeMaster) @@ -63,17 +52,16 @@ void i2cInit(i2c_t *i2cHardware) //activating the Perriferal. I2C_BASE->CR1 |= I2C_CR1_PE; - i2cCR1= I2C_BASE->CR1; - i2cCR2= I2C_BASE->CR2; - i2cISR= I2C_BASE->ISR; - i2cHardware->state = i2cInitialized; +} + +void i2cDeInit(i2c_t *i2cHardware) +{ + } -void i2cReset(i2c_t *i2cHardware) +void i2cWrite(i2c_t *i2cHardware, uint16_t *devAddress, uint8_t *registerAddress, uint8_t *data, uint8_t dataLenght) { - RCC->APB1RSTR |= (1 << i2cBus_Rst_bitPos[i2cHardware->channelNo]); - RCC->APB1RSTR &= ~(1 << i2cBus_Rst_bitPos[i2cHardware->channelNo]); } void i2cRead( i2c_t *i2cHardware, @@ -100,12 +88,13 @@ void i2cRead( i2c_t *i2cHardware, } // this function still doesn't implment 10 bit oopeartion TODO -uint8_t i2cMasterRecieve(i2c_t *i2cHardware, uint8_t devAddress, uint8_t registerAddress, uint8_t *data) +void i2cMasterRecieve(i2c_t *i2cHardware, uint8_t devAddress, uint8_t registerAddress, uint8_t *data) { + // Wait until no communication is ongoign while((I2C_BASE->ISR & (I2C_ISR_BUSY))==I2C_ISR_BUSY); - i2cHardware->state = i2cRecieving; + i2cHardware->state = i2cTransmitting; //Slave address I2C_BASE->CR2 |= devAddress << 1; // The bit no 0 is not taken in concideration in 7bit mode @@ -131,11 +120,11 @@ uint8_t i2cMasterRecieve(i2c_t *i2cHardware, uint8_t devAddress, uint8_t registe //Wait untill all is Transfered while(!(I2C_BASE->ISR & (I2C_ISR_TXE))); - // working well up to this point - //Is the tranfes complete ? while(!(I2C_BASE->ISR & (I2C_ISR_TC))); + i2cHardware->state = i2cRecieving; + //Read Mode I2C_BASE->CR2 |= I2C_CR2_RD_WRN; @@ -160,6 +149,23 @@ uint8_t i2cMasterRecieve(i2c_t *i2cHardware, uint8_t devAddress, uint8_t registe I2C_BASE->CR2 |= I2C_CR2_STOP; //read dtaa from the input register to clear it out - data = I2C_BASE->RXDR; - return data; + *data = I2C_BASE->RXDR; + + i2cHardware->state = i2cReady; +} + + +void i2cMasterSend(i2c_t *i2cHardware, uint16_t *devAddress, uint8_t *registerAddress, uint8_t *data) +{ + +} + +void i2cSlaveRecieve(i2c_t *i2cHardware, uint16_t *devAddress, uint8_t *registerAddress, uint8_t *data) +{ + +} + +void i2cSlaveSend(i2c_t *i2cHardware, uint16_t *devAddress, uint8_t *registerAddress, uint8_t *data) +{ + } diff --git a/ked/drivers/led/CMakeLists.txt b/ked/drivers/led/CMakeLists.txt deleted file mode 100644 index be6b2df..0000000 --- a/ked/drivers/led/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -add_library(ledDriver led.cpp) - -target_compile_options(ledDriver PRIVATE ${C_FLAGS}) -target_compile_definitions(ledDriver PRIVATE ${C_DEFS}) -target_include_directories(ledDriver PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -add_library(sub::led ALIAS ledDriver) diff --git a/ked/drivers/led/led.cpp b/ked/drivers/led/led.cpp deleted file mode 100644 index 1749cf4..0000000 --- a/ked/drivers/led/led.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "led.hpp" - -Led::Led(Pin* pin_ptr) -{ - pin = pin_ptr; - pin->init(); - pin->setMode(Pin::mode::output); - pin->setSpeed(Pin::speed::fast); -} - -Led::~Led() -{ - -} - -void Led::on() -{ - pin->write(true); -} - -void Led::off() -{ - pin->write(false); -} - -void Led::toggle() -{ - pin->toggle(); -} - diff --git a/ked/drivers/led/led.hpp b/ked/drivers/led/led.hpp deleted file mode 100644 index 5fda306..0000000 --- a/ked/drivers/led/led.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _LED_HPP -#define _LED_HPP - - -class Led -{ - public: - Led(Pin *pin_ptr); - ~Led(); - - void on(); - void off(); - void toggle(); - - private: - Pin *pin; -}; - - -#endif /* __LED_HPP */ diff --git a/ked/drivers/spi_ch.c b/ked/drivers/spi_ch.c deleted file mode 100644 index c99d329..0000000 --- a/ked/drivers/spi_ch.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "spi_ch.h" - -// generic implementation of spi channel class - - -uint8_t spiCH_readReg(spi_ch_t *spi_ch, - uint8_t reg_address) { - uitn8_t buf; - - // select target device - pinWrite(spi_ch->pin,0); - - // send address of target register - spi_trx(spi_ch->spi, reg_address); - - // read from target register - buf = spi_trx(spi->spi,0x00); - - // release target device - pinWrite(spi_ch->pin,1); - - return buf; -} - -void spiCH_autoReadBlock(spi_ch_t *spi_ch, - uint8_t start_address, - uint8_t* buffer, - uint8_t buf_len) { - uint8_t i = 0; - - // select target device - pinWrite(spi_ch->pin,0); - - // send address of starting register - spi_trx(spi_ch->spi, reg_address); - - // read block from device - for(;i < buf_len;i++) { - buffer[i] = spi_trx(spi_ch->spi, 0x00); - } - - // release target device - pinWrite(spi_ch->pin,1); -} - -void spiCH_writeReg(spi_ch_t *spi_ch, - uint8_t reg_address, - uint8_t data) { - // select target device - pinWrite(spi_ch->pin,0); - - // send address of target register - spi_trx(spi_ch->spi, reg_address); - - // write to target register - spi_trx(spi->spi, data); - - // release target device - pinWrite(spi_ch->pin,1); -} - -void spiCH_writeBlock(spi_ch_t *spi_ch, - uint8_t start_address, - const uint8_t *data, - uint8_t data_len) { - uint8_t i = 0; - - // select target device - pinWrite(spi_ch->pin,0); - - // send address of starting register - spi_trx(spi_ch->spi, reg_address); - - // read block from device - for(;i < buf_len;i++) { - spi_trx(spi_ch->spi, data[i]); - } - - // release target device - pinWrite(spi_ch->pin,1); -} - diff --git a/main.c b/main.c index d140061..eb868c0 100644 --- a/main.c +++ b/main.c @@ -46,9 +46,9 @@ void printBinary32(uint32_t toPrint, uint8_t lsbFirst) print_Usart(usart2, "\n\r"); if(lsbFirst) { - print_Usart(usart2, "| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|"); + print_Usart(usart2, "Bit Pos | 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|"); print_Usart(usart2, "\n\r"); - usartSendChar(usart2, '|'); + print_Usart(usart2, "Bits |"); for(i=0; i < 32; i++) { pt = (toPrint >> i) & 1; @@ -59,9 +59,9 @@ void printBinary32(uint32_t toPrint, uint8_t lsbFirst) } else { - print_Usart(usart2, "|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|"); + print_Usart(usart2, "Bit Pos |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|"); print_Usart(usart2, "\n\r"); - usartSendChar(usart2, '|'); + print_Usart(usart2, "Bits |"); for(i=0; i < 32; i++) { pt = (toPrint >> (31-i)) & 1; @@ -80,9 +80,9 @@ void printBinary8(uint8_t toPrint, uint8_t lsbFirst) print_Usart(usart2, "\n\r"); if(lsbFirst) { - print_Usart(usart2, "| 0| 1| 2| 3| 4| 5| 6| 7|"); + print_Usart(usart2, "Bit Pos | 0| 1| 2| 3| 4| 5| 6| 7|"); print_Usart(usart2, "\n\r"); - usartSendChar(usart2, '|'); + print_Usart(usart2, "Bits |"); for(i=0; i < 8; i++) { pt = (toPrint >> i) & 1; @@ -93,9 +93,9 @@ void printBinary8(uint8_t toPrint, uint8_t lsbFirst) } else { - print_Usart(usart2, "| 7| 6| 5| 4| 3| 2| 1| 0|"); + print_Usart(usart2, "Bit Pos | 7| 6| 5| 4| 3| 2| 1| 0|"); print_Usart(usart2, "\n\r"); - usartSendChar(usart2, '|'); + print_Usart(usart2, "Bits |"); for(i=0; i < 8; i++) { pt = (toPrint >> (7-i)) & 1; @@ -113,8 +113,6 @@ int main(int argc, char *argv[]) uint8_t slaveAddress = 0xC0; uint8_t registerToRead = 0x00; uint8_t i2cRecieved = 0; - uint8_t buffer [8]; - uint8_t data = 0; // making array with all available timers //timerNo_t timers[MAX_TIMER_CHANNEL_COUNT] = {timer_1, timer_2, timer_3, timer_14, timer_16, timer_17}; @@ -156,6 +154,7 @@ int main(int argc, char *argv[]) pinSetAlternate(pinA10, 4); i2c_t i2c_1; + /* i2c_1.channelNo = I2C_CH_1; i2c_1.mode = i2cModeMaster; i2c_1.address = 0x0; @@ -168,15 +167,16 @@ int main(int argc, char *argv[]) i2c_1.timing = 0x2000090E; // Taken from stm code generator i2c_1.wakeOn = i2cWakeUpDisabled; i2c_1.state = i2cNotInitialized; +*/ - i2cInit(&i2c_1); + i2cInit(&i2c_1, I2C_CH_1, i2cModeMaster, 0x00,0x00, i2cAddressCountSingle, i2cAddressSizeSevenBits, i2cSpeedStandart, i2cOpperationPolling, i2cClockStrechingDisable, i2cWakeUpDisabled); - data = i2cMasterRecieve(&i2c_1,slaveAddress,registerToRead,&i2cRecieved); - - - printBinary8(data,0); + i2cMasterRecieve(&i2c_1,slaveAddress,registerToRead,&i2cRecieved); + printBinary8(i2cRecieved,0); + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "\n\r"); print_Usart(usart2, "All is working fine\n\r"); while(1)