##// END OF EJS Templates
sync
jeandet@PC-DE-JEANDET.lab-lpp.local -
r24:5d5838023b3d default
parent child
Show More
@@ -93,7 +93,7 void bsp_spi_init()
93
93
94 void bsp_iic_init()
94 void bsp_iic_init()
95 {
95 {
96 if(0==i2copenandconfig(i2c1,0,100000,PB9,PB6))printf("I2C1 opened\n\r");
96 if(0==i2copenandconfig(i2c1,0,400000,PB9,PB6))printf("I2C1 opened\n\r");
97 i2cenable(i2c1);
97 i2cenable(i2c1);
98 }
98 }
99
99
@@ -12,6 +12,10 extern streamdevice* __opnfiles__[];
12 int main()
12 int main()
13 {
13 {
14 //gpioset(PSU_DISABLE);
14 //gpioset(PSU_DISABLE);
15 gpio_t dacRst=gpioopen(PD4);
16 gpiosetspeed(&dacRst,gpiohighspeed);
17 gpiosetdir(&dacRst,gpiooutdir);
18 gpioset(dacRst);
15 printf("i2C Control register 1 (I2C_CR1) = %x\n\r",I2C1->CR1);
19 printf("i2C Control register 1 (I2C_CR1) = %x\n\r",I2C1->CR1);
16 printf("i2C Control register 2 (I2C_CR2) = %x\n\r",I2C1->CR2);
20 printf("i2C Control register 2 (I2C_CR2) = %x\n\r",I2C1->CR2);
17 printf("i2C Status register 1 (I2C_SR1) = %x\n\r",I2C1->SR1);
21 printf("i2C Status register 1 (I2C_SR1) = %x\n\r",I2C1->SR1);
@@ -25,7 +29,7 int main()
25 for(volatile int i=0;i<1024*2048;i++);
29 for(volatile int i=0;i<1024*2048;i++);
26 gpioclr(LED1);
30 gpioclr(LED1);
27 gpioset(LED2);
31 gpioset(LED2);
28 i2cwrite(i2c1,0x4a,"test",4);
32 i2cwrite(i2c1,0x4a,"test",1);
29 }
33 }
30 printf("hello world\n\r");
34 printf("hello world\n\r");
31 return 0;
35 return 0;
@@ -52,7 +52,8 extern int i2csetspeed(i2c_t dev,uint32_
52 //extern int i2csetdatabits(i2c_t* dev,uartbits_t databits);
52 //extern int i2csetdatabits(i2c_t* dev,uartbits_t databits);
53 extern int i2cwrite(i2c_t dev,char address,char* data,int count);
53 extern int i2cwrite(i2c_t dev,char address,char* data,int count);
54 extern int i2cread(i2c_t dev,char address,char* data,int count);
54 extern int i2cread(i2c_t dev,char address,char* data,int count);
55
55 extern int i2cbusy(i2c_t dev);
56 extern int i2cStatusCheck(i2c_t dev,int32_t flagMask);
56 #ifdef __cplusplus
57 #ifdef __cplusplus
57 }
58 }
58 #endif
59 #endif
@@ -66,16 +66,13 i2c_t i2copenandconfig(int count,uint32_
66 i2c_t dev = i2copen(count);
66 i2c_t dev = i2copen(count);
67 if(dev!=-1)
67 if(dev!=-1)
68 {
68 {
69 i2cenable(count);
69 i2cclose(dev);
70 I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
71 _dev_->CR1 = (1<<15);
72 _dev_->CR1 &=~(1<<15);
73 i2cdisable(count);
74 i2csetpins(dev,SDA,SCL);
70 i2csetpins(dev,SDA,SCL);
71 i2copen(count);
72 i2cenable(count);
73 //I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
75 i2csetspeed(dev,speed);
74 i2csetspeed(dev,speed);
76 i2cenable(count);
75 i2cenable(count);
77 _dev_->CR1|=1<<15;
78 _dev_->CR1&=~(1<<15);
79 }
76 }
80 return dev;
77 return dev;
81 }
78 }
@@ -163,15 +160,12 int i2csetspeed(i2c_t dev,uint32_t speed
163 int32_t APB1Freq=getAPB1Freq()/1000000;
160 int32_t APB1Freq=getAPB1Freq()/1000000;
164 if((APB1Freq>1)&&(APB1Freq<43))
161 if((APB1Freq>1)&&(APB1Freq<43))
165 {
162 {
166 i2cdisable(dev);
163
167 uint16_t tmpreg=_dev_->CR2;
164 uint16_t tmpreg=_dev_->CR2;
168 tmpreg &= ~(0x1f);
165 tmpreg &= ~(0x1f);
169 tmpreg |= APB1Freq;
166 tmpreg |= APB1Freq;
170 _dev_->CR2=tmpreg;
167 _dev_->CR2=tmpreg;
171 tmpreg=_dev_->TRISE;
168 i2cdisable(dev);
172 tmpreg &= ~(0x3f);
173 tmpreg |= APB1Freq+1;
174 _dev_->TRISE = tmpreg;
175 tmpreg=_dev_->CCR;
169 tmpreg=_dev_->CCR;
176 APB1Freq=getAPB1Freq();
170 APB1Freq=getAPB1Freq();
177 if(speed>100000) //100kHz= standard mode, 400kHz= fast mode
171 if(speed>100000) //100kHz= standard mode, 400kHz= fast mode
@@ -191,29 +185,46 int i2csetspeed(i2c_t dev,uint32_t speed
191 tmpreg |= 0xfff & (APB1Freq/(2*speed));
185 tmpreg |= 0xfff & (APB1Freq/(2*speed));
192 }
186 }
193 _dev_->CCR=tmpreg;
187 _dev_->CCR=tmpreg;
188 tmpreg=_dev_->TRISE;
189 tmpreg &= ~(0x3f);
190 tmpreg |= (APB1Freq/1000000)+1;
191 _dev_->TRISE = tmpreg;
192 i2cenable(dev);
194 return 0;
193 return 0;
195 }
194 }
196 }
195 }
197 return -1;
196 return -1;
198 }
197 }
199
198
199 int i2cbusy(i2c_t dev)
200 {
201 if((dev<3)&&(dev>=0))
202 {
203 I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
204 if((_dev_->SR2 & 2) ==2) return 1; /* Dev is busy */
205 return 0; /* Dev isn't busy */
206 }
207 return -1; /* Error, dev is out of range */
208 }
209
200 int i2cwrite(i2c_t dev,char address,char* data,int count)
210 int i2cwrite(i2c_t dev,char address,char* data,int count)
201 {
211 {
202 if((dev<3)&&(dev>=0))
212 if((dev<3)&&(dev>=0))
203 {
213 {
204 I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
214 I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
215 while(i2cbusy(dev));
205 _dev_->CR1 |= 1<<8;
216 _dev_->CR1 |= 1<<8;
206 while((_dev_->SR1&1)==0);
217 while(!i2cStatusCheck(dev,((uint32_t)0x00030001)));
207 _dev_->DR= address<<1;
218 _dev_->DR= address<<1;
208 while((_dev_->SR1 & (1<<3))==0);
219 while(!i2cStatusCheck(dev, ((uint32_t)0x00070082)));
209 address=_dev_->SR2;
220 address=_dev_->SR2;
210 for(int i=0;i<count;i++)
221 for(int i=0;i<count;i++)
211 {
222 {
212 while((_dev_->SR1 & (1<<7))==0);
223 while(!i2cStatusCheck(dev,((uint32_t)0x00070080)));
213 _dev_->DR= data[i];
224 _dev_->DR= data[i];
214 }
225 }
215 while((_dev_->SR1 & (1<<7))==0);
226 while(!i2cStatusCheck(dev,1<<7));
216 while((_dev_->SR1 & (1<<2))==0);
227 while(!i2cStatusCheck(dev,1<<2));
217 _dev_->CR1 |= 1<<9;
228 _dev_->CR1 |= 1<<9;
218 return count;
229 return count;
219 }
230 }
@@ -224,15 +235,16 int i2cread(i2c_t dev,char address,char*
224 {
235 {
225 if((dev<3)&&(dev>=0))
236 if((dev<3)&&(dev>=0))
226 {
237 {
238 while(i2cbusy(dev));
227 I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
239 I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
228 _dev_->CR1 |= (1<<8) | (1<<10);
240 _dev_->CR1 |= (1<<8) | (1<<10);
229 if(count==1)
241 if(count==1)
230 {
242 {
231 _dev_->CR1 &= ~(1<<10);
243 _dev_->CR1 &= ~(1<<10);
232 }
244 }
233 while((_dev_->SR1&1)==0);
245 while(!i2cStatusCheck(dev,0x00030001));
234 _dev_->DR= (address<<1) + 1;
246 _dev_->DR= (address<<1) + 1;
235 while((_dev_->SR1 & (1<<3))==0);
247 while(!i2cStatusCheck(dev, ((uint32_t)0x00070082)));
236 address=_dev_->SR2;
248 address=_dev_->SR2;
237 for(int i=0;i<count-1;i++)
249 for(int i=0;i<count-1;i++)
238 {
250 {
@@ -249,6 +261,22 int i2cread(i2c_t dev,char address,char*
249 }
261 }
250
262
251
263
264 int i2cStatusCheck(i2c_t dev,int32_t flagMask)
265 {
266 int32_t flag;
267 __asm__("nop");
268 __asm__("nop");
269 __asm__("nop");
270 __asm__("nop");
271 if((dev<3)&&(dev>=0))
272 {
273 I2C_TypeDef* _dev_ = _i2c_dev_table[(int)dev];
274 flag= _dev_->SR1 + (_dev_->SR2<<16);
275 if(flagMask==(flag & flagMask))
276 return 1;
277 return 0;
278 }
279 return -1;
280 }
252
281
253
282
254
General Comments 0
You need to be logged in to leave comments. Login now