diff --git a/bsp/src/BEAGLESYNTH/bsp.c b/bsp/src/BEAGLESYNTH/bsp.c --- a/bsp/src/BEAGLESYNTH/bsp.c +++ b/bsp/src/BEAGLESYNTH/bsp.c @@ -26,6 +26,7 @@ #include #include #include +#include uint32_t OSC0 =8000000; uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; @@ -43,6 +44,7 @@ int bsp_init() } bsp_GPIO_init(); bsp_uart_init(); + bsp_iic_init(); printf("\r================================================================\n\r"); printf("================================================================\n\r"); printf(BSP); @@ -119,7 +121,7 @@ void bsp_spi_init() void bsp_iic_init() { - + i2copenandconfig(i2c2,0,400000,PF0,PF1); } void bsp_SD_init() diff --git a/bsp/src/SOLAR_LFR_PSU/bsp.c b/bsp/src/SOLAR_LFR_PSU/bsp.c --- a/bsp/src/SOLAR_LFR_PSU/bsp.c +++ b/bsp/src/SOLAR_LFR_PSU/bsp.c @@ -97,10 +97,8 @@ void bsp_spi_init() void bsp_iic_init() { - if(0==i2copenandconfig(i2c1,0,400000,PB9,PB6))printf("I2C1 opened\n\r"); - i2cenable(i2c1); - if(0==i2copenandconfig(i2c3,0,400000,PC9,PA8))printf("I2C3 opened\n\r"); - i2cenable(i2c3); + i2copenandconfig(i2c1,0,400000,PB9,PB6); + i2copenandconfig(i2c3,0,400000,PC9,PA8); } void bsp_SD_init() diff --git a/examples/BeagleSynthHello/BeagleSynthHello.pro b/examples/BeagleSynthHello/BeagleSynthHello.pro --- a/examples/BeagleSynthHello/BeagleSynthHello.pro +++ b/examples/BeagleSynthHello/BeagleSynthHello.pro @@ -2,8 +2,8 @@ TEMPLATE = app CONFIG += console CONFIG -= qt -#BSP = BEAGLESYNTH -BSP = SOLAR_LFR_PSU +BSP = BEAGLESYNTH +#BSP = SOLAR_LFR_PSU include($$(libuc2)/bsp/cfg/$$BSP/bsp.pri) #include($$(libuc2)/rules/stm32f4-arm-none-eabi-gcc/rules.pri) diff --git a/examples/BeagleSynthHello/main.c b/examples/BeagleSynthHello/main.c --- a/examples/BeagleSynthHello/main.c +++ b/examples/BeagleSynthHello/main.c @@ -6,16 +6,21 @@ #include #include #include +#include extern streamdevice* __opnfiles__[]; int main() { - CS43L22_t audioDac1; - cs43l22open(&audioDac1,i2c1,0); - char id=cs43l22getID(&audioDac1); - printf("DAC ID=%x\n\r",0x0ff&id); + INA226_t Psens1; + gpioset(PSU_DISABLE); + ina226open(&Psens1,i2c2,0,0,15,300000); + uint16_t id=ina226getID(&Psens1); + printf("INA226 ID=%x\n\r",0x0ffff&id); + id=ina226getReg(&Psens1,INA226_Calibration_Reg); + printf("INA226 CAL=%x\n\r",0x0ffff&id); + unsigned int current; while(1) { for(volatile int i=0;i<1024*2048;i++); @@ -24,7 +29,8 @@ int main() for(volatile int i=0;i<1024*2048;i++); gpioclr(LED1); gpioset(LED2); - i2cwrite(i2c1,0x4a,"test",1); + current = ina226getCurrent(&Psens1); + printf("Current = %uµA %umA\n\r",current,current/1000); } printf("hello world\n\r"); return 0; diff --git a/lib/includes/ina226.h b/lib/includes/ina226.h --- a/lib/includes/ina226.h +++ b/lib/includes/ina226.h @@ -34,16 +34,20 @@ typedef struct INA226_t }INA226_t; extern int ina226open(INA226_t* dev,i2c_t i2cdev,uint8_t A0,uint8_t A1,uint32_t shuntmOhm, uint32_t CurrentRangeuAmp); -extern uint8_t ina226getID(INA226_t* dev); +extern uint16_t ina226getID(INA226_t* dev); extern int ina226calibrate(INA226_t* dev,uint32_t shuntmOhm, uint32_t CurrentRangeuAmp); extern uint32_t ina226getBusVoltage(INA226_t* dev); extern uint32_t ina226getPower(INA226_t* dev); +extern uint32_t ina226getCurrent(INA226_t* dev); +extern uint16_t ina226getReg(INA226_t* dev,char reg); +extern int ina226setReg(INA226_t* dev,char reg,int16_t value); #define INA226_I2C_ADDRESS 0x40 #define INA226_Die_ID_Reg 0xFF +#define INA226_Configuration_Reg 0 #define INA226_Shunt_Voltage_Reg 1 #define INA226_Bus_Voltage_Reg 2 #define INA226_Power_Reg 3 diff --git a/lib/src/common/POWER/ina226/ina226.c b/lib/src/common/POWER/ina226/ina226.c --- a/lib/src/common/POWER/ina226/ina226.c +++ b/lib/src/common/POWER/ina226/ina226.c @@ -31,19 +31,18 @@ int ina226open(INA226_t *dev, i2c_t i2cd dev->devAddress = INA226_I2C_ADDRESS | (A0 & 1) | ((A1<<1) & 2); dev->shuntmOhm = shuntmOhm; dev->CurrentRangeuAmp = CurrentRangeuAmp; - return 1; + ina226setReg(dev,INA226_Configuration_Reg,0x8000); + return ina226calibrate(dev,shuntmOhm,CurrentRangeuAmp); } return -1; } -uint8_t ina226getID(INA226_t* dev) +uint16_t ina226getID(INA226_t* dev) { if(dev != NULL) { - char DATA[]={INA226_Die_ID_Reg}; - i2cwrite(dev->i2cdev,dev->devAddress,DATA,1); - i2cread(dev->i2cdev,dev->devAddress,DATA,1); - return DATA[0]; + uint16_t id=ina226getReg(dev,INA226_Die_ID_Reg); + return id; } return -1; } @@ -54,39 +53,58 @@ int ina226calibrate(INA226_t* dev,uint32 dev->shuntmOhm = shuntmOhm; dev->CurrentRangeuAmp = CurrentRangeuAmp; uint32_t CAL= (uint32_t)(5210000/(shuntmOhm*(CurrentRangeuAmp>>15))); - char CMD[3]; - CMD[0]=INA226_Calibration_Reg; - CMD[1]=(char)(0xff & (CAL>>8)); - CMD[2]=(char)(0xff & CAL); - i2cwrite(dev->i2cdev,dev->devAddress,CMD,3); + printf("CAL = %x\n\r",CAL); + return ina226setReg(dev,INA226_Calibration_Reg,(uint16_t)CAL); } uint32_t ina226getBusVoltage(INA226_t *dev) { - char CMD[2]; - CMD[0]=INA226_Bus_Voltage_Reg; - i2cwrite(dev->i2cdev,dev->devAddress,CMD,1); - i2cread(dev->i2cdev,dev->devAddress,CMD,2); - uint32_t busVoltage= CMD[0]; - busVoltage = (busVoltage<<8) + CMD[1]; + uint32_t busVoltage= ina226getReg(dev,INA226_Bus_Voltage_Reg); busVoltage*= 1250; return busVoltage; } uint32_t ina226getPower(INA226_t *dev) { - char CMD[2]; - CMD[0]=INA226_Power_Reg; - i2cwrite(dev->i2cdev,dev->devAddress,CMD,1); - i2cread(dev->i2cdev,dev->devAddress,CMD,2); - uint32_t power= CMD[0]; - power = (power<<8) + CMD[1]; - power*= ((CurrentRangeuAmp>>15)*25); - return busVoltage; + uint32_t power= ina226getReg(dev,INA226_Power_Reg); + power*= ((dev->CurrentRangeuAmp>>15)*25); + return power; +} + +uint32_t ina226getCurrent(INA226_t *dev) +{ + uint32_t current= ina226getReg(dev,INA226_Current_Reg); + //current*= ((dev->CurrentRangeuAmp>>15)); + return current; +} + +uint16_t ina226getReg(INA226_t* dev,char reg) +{ + if(dev != NULL) + { + char DATA[2]; + DATA[0]=reg; + i2cwrite(dev->i2cdev,dev->devAddress,DATA,1); + i2cread(dev->i2cdev,dev->devAddress,DATA,2); + uint16_t val=DATA[0]; + val=(val<<8)+DATA[1]; + return val; + } + return -1; } +int ina226setReg(INA226_t* dev,char reg,int16_t value) +{ + if(dev != NULL) + { + char DATA[3]; + DATA[0]=INA226_Calibration_Reg; + DATA[1]=(char)(0xff & (value>>8)); + DATA[2]=(char)(0xff & value); + if(3==i2cwrite(dev->i2cdev,dev->devAddress,DATA,3))return 1; + } + return -1; +} - -