diff --git a/I2C/.cproject b/I2C/.cproject new file mode 100644 index 0000000..44e7a32 --- /dev/null +++ b/I2C/.cproject @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="UTF-8"?> +<TargetConfig> +<Properties property_2="LPC15xx_256K.cfx" property_3="NXP" property_4="LPC1549" property_count="5" version="100300"/> +<infoList vendor="NXP"> +<info chip="LPC1549" connectscript="LPC15RunBootRomConnect.scp" flash_driver="LPC15xx_256K.cfx" match_id="0x0" name="LPC1549" resetscript="LPC15RunBootRomReset.scp" stub="crt_emu_cm3_gen"> +<chip> +<name>LPC1549</name> +<family>LPC15xx</family> +<vendor>NXP (formerly Philips)</vendor> +<reset board="None" core="Real" sys="Real"/> +<clock changeable="TRUE" freq="12MHz" is_accurate="TRUE"/> +<memory can_program="true" id="Flash" is_ro="true" type="Flash"/> +<memory id="RAM" type="RAM"/> +<memory id="Periph" is_volatile="true" type="Peripheral"/> +<memoryInstance derived_from="Flash" id="MFlash256" location="0x0" size="0x40000"/> +<memoryInstance derived_from="RAM" id="Ram0_16" location="0x2000000" size="0x4000"/> +<memoryInstance derived_from="RAM" id="Ram1_16" location="0x2004000" size="0x4000"/> +<memoryInstance derived_from="RAM" id="Ram2_4" location="0x2008000" size="0x1000"/> +</chip> +<processor> +<name gcc_name="cortex-m3">Cortex-M3</name> +<family>Cortex-M</family> +</processor> +</info> +</infoList> +</TargetConfig> + + + LPCXpresso1549 + + \ No newline at end of file diff --git a/I2C/inc/I2C.h b/I2C/inc/I2C.h new file mode 100644 index 0000000..2ac6c2f --- /dev/null +++ b/I2C/inc/I2C.h @@ -0,0 +1,33 @@ +/* + * I2C.h + * + * Created on: 21.2.2016 + * Author: krl + */ + +#ifndef I2C_H_ +#define I2C_H_ + +#include "chip.h" + +struct I2C_config { + unsigned int device_number; + unsigned int speed; + unsigned int clock_divider; + unsigned int i2c_mode; + I2C_config(): device_number(0), speed(100000), clock_divider(40), i2c_mode(IOCON_SFI2C_EN) {}; +}; + +class I2C { +public: + I2C(const I2C_config &cfg); + virtual ~I2C(); + bool transaction(uint8_t devAddr, uint8_t *txBuffPtr, uint16_t txSize, uint8_t *rxBuffPtr, uint16_t rxSize); + bool write(uint8_t devAddr, uint8_t *txBuffPtr, uint16_t txSize); + bool read(uint8_t devAddr, uint8_t *rxBuffPtr, uint16_t rxSize); +private: + LPC_I2C_T *device; + static uint32_t I2CM_XferBlocking(LPC_I2C_T *pI2C, I2CM_XFER_T *xfer); +}; + +#endif /* I2C_H_ */ diff --git a/I2C/liblinks.xml b/I2C/liblinks.xml new file mode 100644 index 0000000..1dc1803 --- /dev/null +++ b/I2C/liblinks.xml @@ -0,0 +1,32 @@ + + + + + ${MacroStart}workspace_loc:/${ProjName}/inc${MacroEnd} + + + ${MacroStart}workspace_loc:/${ProjName}/inc${MacroEnd} + + + ${ProjName} + + + ${MacroStart}workspace_loc:/${ProjName}/Debug${MacroEnd} + + + ${MacroStart}workspace_loc:/${ProjName}/Release${MacroEnd} + + + ${ProjName} + + + diff --git a/I2C/src/I2C.cpp b/I2C/src/I2C.cpp new file mode 100644 index 0000000..7b11a09 --- /dev/null +++ b/I2C/src/I2C.cpp @@ -0,0 +1,143 @@ +/* + * I2C.cpp + * + * Created on: 21.2.2016 + * Author: krl + * Based on example provided by NXP Semiconductors. See copyright notice below. + */ + +/* + * @brief I2CM bus master example using polling mode + * + * @note + * Copyright(C) NXP Semiconductors, 2014 + * All rights reserved. + * + * @par + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * LPC products. This software is supplied "AS IS" without any warranties of + * any kind, and NXP Semiconductors and its licensor disclaim any and + * all warranties, express or implied, including all implied warranties of + * merchantability, fitness for a particular purpose and non-infringement of + * intellectual property rights. NXP Semiconductors assumes no responsibility + * or liability for the use of the software, conveys no license or rights under any + * patent, copyright, mask work right, or any other intellectual property rights in + * or to any products. NXP Semiconductors reserves the right to make changes + * in the software without notification. NXP Semiconductors also makes no + * representation or warranty that such application will be suitable for the + * specified use without further testing or modification. + * + * @par + * Permission to use, copy, modify, and distribute this software and its + * documentation is hereby granted, under NXP Semiconductors' and its + * licensor's relevant copyrights in the software, without fee, provided that it + * is used in conjunction with NXP Semiconductors microcontrollers. This + * copyright, permission, and disclaimer notice must appear in all copies of + * this code. + */ + +#include "I2C.h" + + +I2C::I2C(const I2C_config &cfg): device(nullptr) { + if(cfg.device_number == 0) { + device = LPC_I2C0; + // board init must have been called before the pins can be configured + Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 22, IOCON_DIGMODE_EN | cfg.i2c_mode); + Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 23, IOCON_DIGMODE_EN | cfg.i2c_mode); + Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SCL); + Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SDA); + } + else { + // currently we support only I2C number 0 + } + + if(device) { + /* Enable I2C clock and reset I2C peripheral - the boot ROM does not + do this */ + Chip_I2C_Init(device); + + /* Setup clock rate for I2C */ + Chip_I2C_SetClockDiv(device, cfg.clock_divider); + + /* Setup I2CM transfer rate */ + Chip_I2CM_SetBusSpeed(device, cfg.speed); + + /* Enable Master Mode */ + Chip_I2CM_Enable(device); + } +} + +I2C::~I2C() { + // TODO Auto-generated destructor stub +} + +bool I2C::write(uint8_t devAddr, uint8_t *txBuffPtr, uint16_t txSize) +{ + return transaction(devAddr, txBuffPtr, txSize, nullptr, 0); +} + +bool I2C::read(uint8_t devAddr, uint8_t *rxBuffPtr, uint16_t rxSize) +{ + return transaction(devAddr, nullptr, 0, rxBuffPtr, rxSize); +} + + +bool I2C::transaction(uint8_t devAddr, uint8_t *txBuffPtr, uint16_t txSize, uint8_t *rxBuffPtr, uint16_t rxSize) { + I2CM_XFER_T i2cmXferRec; + + // make sure that master is idle + while(!Chip_I2CM_IsMasterPending(device)); + + /* Setup I2C transfer record */ + i2cmXferRec.slaveAddr = devAddr; + i2cmXferRec.status = 0; + i2cmXferRec.txSz = txSize; + i2cmXferRec.rxSz = rxSize; + i2cmXferRec.txBuff = txBuffPtr; + i2cmXferRec.rxBuff = rxBuffPtr; + + I2CM_XferBlocking(device, &i2cmXferRec); + // Chip_I2CM_XferBlocking returns before stop condition is fully completed + // therefore we need to wait for master to be idle when doing back-to-back transactions (see beginning of the function) + + /* Test for valid operation */ + if (i2cmXferRec.status == I2CM_STATUS_OK) { + return true; + } + else { + return false; + } +} + +/* Transmit and Receive data in master mode */ +/* This duplicates (and combines) the functionality of Chip_I2CM_Xfer and Chip_I2CM_XferBlocking with a modification + * that allows us to do a zero length write (needed to use honeywell humidity/temp sensor) + */ +uint32_t I2C::I2CM_XferBlocking(LPC_I2C_T *pI2C, I2CM_XFER_T *xfer) +{ + uint32_t ret = 0; + /* start transfer */ + + /* set the transfer status as busy */ + xfer->status = I2CM_STATUS_BUSY; + /* Clear controller state. */ + Chip_I2CM_ClearStatus(pI2C, I2C_STAT_MSTRARBLOSS | I2C_STAT_MSTSTSTPERR); + /* Write Address and RW bit to data register */ + //Chip_I2CM_WriteByte(pI2C, (xfer->slaveAddr << 1) | (xfer->txSz == 0)); // original NXP version + // krl : both read and write lenght is 0 --> write (for honeywell temp sensor) + Chip_I2CM_WriteByte(pI2C, (xfer->slaveAddr << 1) | (xfer->txSz == 0 && xfer->rxSz != 0)); + /* Enter to Master Transmitter mode */ + Chip_I2CM_SendStart(pI2C); + + while (ret == 0) { + /* wait for status change interrupt */ + while (!Chip_I2CM_IsMasterPending(pI2C)) {} + /* call state change handler */ + ret = Chip_I2CM_XferHandler(pI2C, xfer); + } + return ret; +} + + diff --git a/esp-vent-main/.cproject b/esp-vent-main/.cproject index cbc0616..56d571c 100644 --- a/esp-vent-main/.cproject +++ b/esp-vent-main/.cproject @@ -43,6 +43,7 @@ + @@ -114,12 +117,14 @@ + @@ -253,12 +261,14 @@ +