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 @@ -93,7 +93,7 @@ void bsp_spi_init() void bsp_iic_init() { - if(0==i2copenandconfig(i2c1,0,100000,PB9,PB6))printf("I2C1 opened\n\r"); + if(0==i2copenandconfig(i2c1,0,400000,PB9,PB6))printf("I2C1 opened\n\r"); i2cenable(i2c1); } diff --git a/examples/BeagleSynthHello/main.c b/examples/BeagleSynthHello/main.c --- a/examples/BeagleSynthHello/main.c +++ b/examples/BeagleSynthHello/main.c @@ -12,6 +12,10 @@ extern streamdevice* __opnfiles__[]; int main() { //gpioset(PSU_DISABLE); + gpio_t dacRst=gpioopen(PD4); + gpiosetspeed(&dacRst,gpiohighspeed); + gpiosetdir(&dacRst,gpiooutdir); + gpioset(dacRst); printf("i2C Control register 1 (I2C_CR1) = %x\n\r",I2C1->CR1); printf("i2C Control register 2 (I2C_CR2) = %x\n\r",I2C1->CR2); printf("i2C Status register 1 (I2C_SR1) = %x\n\r",I2C1->SR1); @@ -25,7 +29,7 @@ int main() for(volatile int i=0;i<1024*2048;i++); gpioclr(LED1); gpioset(LED2); - i2cwrite(i2c1,0x4a,"test",4); + i2cwrite(i2c1,0x4a,"test",1); } printf("hello world\n\r"); return 0; diff --git a/lib/includes/i2c.h b/lib/includes/i2c.h --- a/lib/includes/i2c.h +++ b/lib/includes/i2c.h @@ -52,7 +52,8 @@ extern int i2csetspeed(i2c_t dev,uint32_ //extern int i2csetdatabits(i2c_t* dev,uartbits_t databits); extern int i2cwrite(i2c_t dev,char address,char* data,int count); extern int i2cread(i2c_t dev,char address,char* data,int count); - +extern int i2cbusy(i2c_t dev); +extern int i2cStatusCheck(i2c_t dev,int32_t flagMask); #ifdef __cplusplus } #endif diff --git a/lib/src/stm32f4/I2C/i2c.c b/lib/src/stm32f4/I2C/i2c.c --- a/lib/src/stm32f4/I2C/i2c.c +++ b/lib/src/stm32f4/I2C/i2c.c @@ -66,16 +66,13 @@ i2c_t i2copenandconfig(int count,uint32_ i2c_t dev = i2copen(count); if(dev!=-1) { - i2cenable(count); - I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev]; - _dev_->CR1 = (1<<15); - _dev_->CR1 &=~(1<<15); - i2cdisable(count); + i2cclose(dev); i2csetpins(dev,SDA,SCL); + i2copen(count); + i2cenable(count); + //I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev]; i2csetspeed(dev,speed); i2cenable(count); - _dev_->CR1|=1<<15; - _dev_->CR1&=~(1<<15); } return dev; } @@ -163,15 +160,12 @@ int i2csetspeed(i2c_t dev,uint32_t speed int32_t APB1Freq=getAPB1Freq()/1000000; if((APB1Freq>1)&&(APB1Freq<43)) { - i2cdisable(dev); + uint16_t tmpreg=_dev_->CR2; tmpreg &= ~(0x1f); tmpreg |= APB1Freq; _dev_->CR2=tmpreg; - tmpreg=_dev_->TRISE; - tmpreg &= ~(0x3f); - tmpreg |= APB1Freq+1; - _dev_->TRISE = tmpreg; + i2cdisable(dev); tmpreg=_dev_->CCR; APB1Freq=getAPB1Freq(); if(speed>100000) //100kHz= standard mode, 400kHz= fast mode @@ -191,29 +185,46 @@ int i2csetspeed(i2c_t dev,uint32_t speed tmpreg |= 0xfff & (APB1Freq/(2*speed)); } _dev_->CCR=tmpreg; + tmpreg=_dev_->TRISE; + tmpreg &= ~(0x3f); + tmpreg |= (APB1Freq/1000000)+1; + _dev_->TRISE = tmpreg; + i2cenable(dev); return 0; } } return -1; } +int i2cbusy(i2c_t dev) +{ + if((dev<3)&&(dev>=0)) + { + I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev]; + if((_dev_->SR2 & 2) ==2) return 1; /* Dev is busy */ + return 0; /* Dev isn't busy */ + } + return -1; /* Error, dev is out of range */ +} + int i2cwrite(i2c_t dev,char address,char* data,int count) { if((dev<3)&&(dev>=0)) { I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev]; + while(i2cbusy(dev)); _dev_->CR1 |= 1<<8; - while((_dev_->SR1&1)==0); + while(!i2cStatusCheck(dev,((uint32_t)0x00030001))); _dev_->DR= address<<1; - while((_dev_->SR1 & (1<<3))==0); + while(!i2cStatusCheck(dev, ((uint32_t)0x00070082))); address=_dev_->SR2; for(int i=0;iSR1 & (1<<7))==0); + while(!i2cStatusCheck(dev,((uint32_t)0x00070080))); _dev_->DR= data[i]; } - while((_dev_->SR1 & (1<<7))==0); - while((_dev_->SR1 & (1<<2))==0); + while(!i2cStatusCheck(dev,1<<7)); + while(!i2cStatusCheck(dev,1<<2)); _dev_->CR1 |= 1<<9; return count; } @@ -224,15 +235,16 @@ int i2cread(i2c_t dev,char address,char* { if((dev<3)&&(dev>=0)) { + while(i2cbusy(dev)); I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev]; _dev_->CR1 |= (1<<8) | (1<<10); if(count==1) { _dev_->CR1 &= ~(1<<10); } - while((_dev_->SR1&1)==0); + while(!i2cStatusCheck(dev,0x00030001)); _dev_->DR= (address<<1) + 1; - while((_dev_->SR1 & (1<<3))==0); + while(!i2cStatusCheck(dev, ((uint32_t)0x00070082))); address=_dev_->SR2; for(int i=0;i=0)) + { + I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev]; + flag= _dev_->SR1 + (_dev_->SR2<<16); + if(flagMask==(flag & flagMask)) + return 1; + return 0; + } + return -1; +} -