346. 347. { 348.
349. return I2C_ERR; 350. 351. } 352.
353.
354. I2C_Start(); /*重启I2C*/
355.
356. I2CAck = SendByte(rdDAdr); /*发读器件地址*/ 357.
358. if(!I2CAck) 359. 360. { 361.
362. return I2C_ERR; 363. 364. }
365.
366. _delay_5us(5); 367.
368. for(i=0;i 372. *(pRdDat+i) = RcvByte(); 373. 374. I2C_Rack(); 375. 376. } 377. 378. if(i==num-1) 379. 380. { 381. 382. *(pRdDat+i) = RcvByte(); 383. 384. I2C_nAck(); 385. 386. } 387. 388. I2C_Stop(); 389. 390. return I2C_CRR; 391. 392. } 393. 394. 395. /******************************************************* 396. 397. 写N个数据,前N-1个要应答,最后一个不要应答 398. 399. wrDAdr: write device-address 写器件地址?? 400. 401. wordAdr: word address 写数据的寄存器地址? 402. 403. *pWrDat: p->write data 写数据指针 404. 405. num: number 需要写入的数据个数 406. 407. *******************************************************/ 408. 409. bool I2C_Write(UCHAR wrDAdr,UCHAR wordAdr,UCHAR *pWrDat,UCHAR num) 410. 411. { 412. 413. bool I2CAck; 414. 415. unsigned char i; 416. 417. 418. I2C_Start(); /*启动I2C*/ 419. 420. _delay_5us(5); 421. 422. I2CAck = SendByte(wrDAdr); /*发写器件地址*/ 423. 424. if(!I2CAck) 425. 426. { 427. 428. return I2C_ERR; 429. 430. } 431. 432. I2CAck = SendByte(wordAdr); /*发要写的寄存器地址*/ 433. 434. if(!I2CAck) 435. 436. { 437. 438. return I2C_ERR; 439. 440. } 441. 442. for(i=0;i 446. I2CAck = SendByte(*(pWrDat+i)); 447. 448. if(!I2CAck) 449. 450. {return I2C_ERR;} 451. 452. } 453. 454. if(i==num-1) 455. 456. { 457. 458. I2CAck = SendByte(*(pWrDat+num-1)); 459. 460. if(!I2CAck) 461. 462. {return I2C_ERR;} 463. 464. } 465. 466. I2C_Stop(); 467. 468. return I2CAck; 469. 470. } 以上代码不知为何读出数据不正确,用示波器看我发送的器件地址,寄存器地址这些都对,器件输出的数据是0xFF,程序中读出返回的数据是0x00,弄了一天没对相当郁闷,同志们指点下 终于搞定了, 应该跟我的器件有关,另外if(GPIO_ReadInputPin(I2C_PORT,I2CSDA) == 1)这种不能写成==1,要直接写成if(GPIO_ReadInputPin(I2C_PORT,I2CSDA)),太郁闷了