I2C调试小结


文章首发:http://user.qzone.qq.com/276546441/blog/1303712793


1、硬件部分

I2C物理组成上,只有两根线,一根时钟线,一根数据线,线的具体位置原理图都为标注的,找ISCLISDA管脚即可。I2C的时钟线不像一般总线的时钟,时刻都存在,只有当总线上有数据发送时,才会产生时钟信号;数据线在没有数据传送时,一直为高电平,故如果发送数据时发现返回总线忙的错误,原因一般为数据线上电平被拉低了。

调试I2C信号时,示波器需要设置为触发式,如果需要查看发送数据是否正确,最好用两个探头同时测时钟与数据信号,这样可以方便看出捕获的数据值。


2、软件部分

硬件了解清楚,便需要注意软件部分了。软件部分分为驱动程序与应用程序。接下来我们分别描述。


2.1 驱动程序

由于操作系统的存在,应用软件和硬件打交道需要通过驱动来进行。笔者使用的设备都基于Linux系统,故本文描述内容基于Linux系统。

驱动部分需要了解两个方面内容:I2C设备体系结构和I2C协议含义。

驱动一般分为总线驱动与设备驱动。由于Linux内核是开源的,所有有人都可以定制内核来适应自己的硬件系统来使用。所以一般情况下,我们要写的设备的总线驱动最新内核中都会包含的,有兴趣的可以通过阅读内核代码来了解其工作原理。

设备驱动只需按总线驱动的要求构造数据结构,实现操作函数注册设备即可。代码结构可以参考已有的驱动代码(附录中提供了一种简单协议的I2C驱动代码,有兴趣可以参考一下),复用已有框架代码,实现自己的设备对应的协议便可以。

I2C直观来说只是通信通道,芯片需要设置寄存器数据时,可以自定义通信协议,应用程序按照协议规定组织好数据发给I2C总线即可。协议制定时,不同芯片的协议有可能不同,常见的协议是 | I2C地址 寄存器地址 节数据 |,这些协议在芯片手册中都会有明确说明。比如某款镜头的协议如下图:

图表 1 I2C写时序


        图表 1为该镜头的写操作协议(时序),由图可知,该镜头在I2C体系中的地址是0xBA(说白了也就是协议头),设备地址为了区分读写操作,一个字节中的前七位为设备地址,当最后一位是0时为写操作,值是1时为读操作,紧跟着的一个字节是寄存器地址0x09,然后是写入寄存器的两字节值0000 0010 1000 0100,所以在写这镜头寄存器时给I2C总线发送的数据为0xBA 0x09 0x02 0x84,发送完后,镜头解析完命令便把地址为0x09寄存器的值设置为0x0284

图表 2I2C读时序

图表 2为该镜头的读操作协议(时序),进行读操作之前需要先写入要读的寄存器地址,这便是0xBA 0x09的作用,然后直接读操作,0xBB便是对0xBA地址的I2C设备进行读操作,读出两字节内容,便是0x09对应的寄存器值。

而另一款镜头的协议则有些复杂。见下图。

图表 3:写时序

这个协议的制定格式为设备地址 | 44字节数据 |44字节数据的协议有明确的说明文档,只要按照文档说明组织内容即可达到自己想要的操作。


2.2 应用程序

应用程序主要通过驱动的IOCONTRL接口操作I2C,按手册提供的协议说明发送命令即可,可以参考附录中应用程序部分代码。

    3 附录

  1. 3.1 简单I2C协议驱动代码
  2. #include <dev_i2c.h>
  3. #include <linux/config.h>
  4. #include <linux/module.h>
  5. #include <linux/init.h>
  6. #include <linux/fs.h> /* everything... */
  7. #include <linux/cdev.h>
  8. #include <linux/mm.h>
  9. #include <linux/i2c.h>
  10. #include <linux/kernel.h> /* printk() */
  11. #include <linux/slab.h> /* kmalloc() */
  12. #include <asm/uaccess.h> /* copy_*_user */
  13. static unsigned short gI2C_curAddr;
  14. typedef struct {
  15. int devAddr;
  16. struct i2c_client client; //!< Data structure containing general access routines.
  17. struct i2c_driver driver; //!< Data structure containing information specific to each client.
  18. char name[20];
  19. int nameSize;
  20. int users;
  21. } I2C_Obj;
  22. typedef struct {
  23. struct cdev cdev; /* Char device structure */
  24. int major;
  25. struct semaphore semLock;
  26. I2C_Obj *pObj[I2C_DEV_MAX_ADDR];
  27. uint8_t reg[I2C_TRANSFER_BUF_SIZE_MAX];
  28. uint8_t buffer[I2C_TRANSFER_BUF_SIZE_MAX*4];
  29. } I2C_Dev;
  30. I2C_Dev gI2C_dev;
  31. int I2C_detectClient(struct i2c_adapter *adapter, int address)
  32. {
  33. I2C_Obj *pObj;
  34. struct i2c_client *client;
  35. int err = 0;
  36. #ifdef I2C_DEBUG
  37. printk(KERN_INFO "I2C: I2C_detectClient() at address %x ...\n", address);
  38. #endif
  39. if(address > I2C_DEV_MAX_ADDR) {
  40. printk( KERN_ERR "I2C: ERROR: Invalid device address %x\n", address);
  41. return -1;
  42. }
  43. pObj = gI2C_dev.pObj[address];
  44. if(pObj==NULL) {
  45. printk( KERN_ERR "I2C: ERROR: Object not found for address %x\n", address);
  46. return -1;
  47. }
  48. client = &pObj->client;
  49. if(client->adapter)
  50. return -EBUSY; /* our client is already attached */
  51. memset(client, 0x00, sizeof(struct i2c_client));
  52. client->addr = pObj->devAddr;
  53. client->adapter = adapter;
  54. client->driver = &pObj->driver;
  55. #ifdef I2C_DEBUG
  56. printk(KERN_INFO "I2C: i2c_attach_client() ...\n");
  57. #endif
  58. if((err = i2c_attach_client(client)))
  59. {
  60. printk( KERN_ERR "I2C: ERROR: Couldn't attach %s (address=%x)\n", pObj->name, pObj->devAddr);
  61. client->adapter = NULL;
  62. return err;
  63. }
  64. #ifdef I2C_DEBUG
  65. printk( KERN_INFO "I2C: %s client registered at address %x !\n", pObj->name, pObj->devAddr );
  66. #endif
  67. return 0;
  68. }
  69. int I2C_detachClient(struct i2c_client *client)
  70. {
  71. int err;
  72. if(!client->adapter)
  73. return -ENODEV; /* our client isn't attached */
  74. if((err = i2c_detach_client(client))) {
  75. printk( KERN_ERR "Client deregistration failed (address=%x), client not detached.\n", client->addr);
  76. return err;
  77. }
  78. client->adapter = NULL;
  79. return 0;
  80. }
  81. int I2C_attachAdapter(struct i2c_adapter *adapter)
  82. {
  83. #ifdef I2C_DEBUG
  84. printk(KERN_INFO "I2C: I2C_attachAdapter() ...\n");
  85. #endif
  86. return I2C_detectClient(adapter, gI2C_curAddr);
  87. }
  88. void *I2C_create(int devAddr) {
  89. int ret;
  90. struct i2c_driver *driver;
  91. struct i2c_client *client = client;
  92. I2C_Obj *pObj;
  93. #ifdef I2C_DEBUG
  94. printk(KERN_INFO "I2C: Driver registration in progress for address %x...\n", devAddr);
  95. #endif
  96. devAddr >>= 1;
  97. if(devAddr>I2C_DEV_MAX_ADDR)
  98. return NULL;
  99. if(gI2C_dev.pObj[devAddr]!=NULL) {
  100. // already allocated, increment user count, and return the allocated handle
  101. gI2C_dev.pObj[devAddr]->users++;
  102. return gI2C_dev.pObj[devAddr];
  103. }
  104. pObj = (void*)kmalloc( sizeof(I2C_Obj), GFP_KERNEL);
  105. gI2C_dev.pObj[devAddr] = pObj;
  106. memset(pObj, 0, sizeof(I2C_Obj));
  107. pObj->client.adapter = NULL;
  108. pObj->users++;
  109. pObj->devAddr = devAddr;
  110. gI2C_curAddr = pObj->devAddr;
  111. driver = &pObj->driver;
  112. pObj->nameSize=0;
  113. pObj->name[pObj->nameSize++] = 'I';
  114. pObj->name[pObj->nameSize++] = '2';
  115. pObj->name[pObj->nameSize++] = 'C';
  116. pObj->name[pObj->nameSize++] = '_';
  117. pObj->name[pObj->nameSize++] = 'A' + ((pObj->devAddr >> 0) & 0xF);
  118. pObj->name[pObj->nameSize++] = 'B' + ((pObj->devAddr >> 4) & 0xF);
  119. pObj->name[pObj->nameSize++] = 0;
  120. driver->driver.name = pObj->name;
  121. driver->id = I2C_DRIVERID_MISC;
  122. driver->attach_adapter = I2C_attachAdapter;
  123. driver->detach_client = I2C_detachClient;
  124. #ifdef I2C_DEBUG
  125. printk(KERN_INFO "I2C: i2c_add_driver() ...\n");
  126. #endif
  127. if((ret = i2c_add_driver(driver)))
  128. {
  129. printk( KERN_ERR "I2C: ERROR: Driver registration failed (address=%x), module not inserted.\n", pObj->devAddr);
  130. }
  131. #ifdef I2C_DEBUG
  132. printk(KERN_INFO "I2C: Driver registration successful (address=%x)\n", pObj->devAddr);
  133. #endif
  134. if(ret<0) {
  135. gI2C_dev.pObj[pObj->devAddr] = NULL;
  136. kfree(pObj);
  137. return NULL;
  138. }
  139. return pObj;
  140. }
  141. int I2C_delete(I2C_Obj *pObj)
  142. {
  143. if(pObj==NULL)
  144. return -1;
  145. pObj->users--;
  146. if(pObj->users<=0) {
  147. if(pObj->client.adapter!=NULL) {
  148. if(i2c_del_driver(&pObj->driver))
  149. printk(KERN_ERR "I2C: ERROR: Driver remove failed (address=%x), module not removed.\n", pObj->devAddr);
  150. pObj->client.adapter = NULL;
  151. gI2C_dev.pObj[pObj->devAddr] = NULL;
  152. kfree(pObj);
  153. }
  154. }
  155. return 0;
  156. }
  157. int I2C_read(I2C_Obj *pObj, uint8_t *reg, uint8_t *buffer, uint8_t count, uint8_t dataSize)
  158. {
  159. uint8_t i;
  160. int err;
  161. struct i2c_client *client;
  162. struct i2c_msg msg[1];
  163. unsigned char data[1];
  164. if(pObj==NULL)
  165. return -ENODEV;
  166. client = &pObj->client;
  167. if(!client->adapter)
  168. return -ENODEV;
  169. if(dataSize<=0||dataSize>4)
  170. return -1;
  171. for(i=0; i<count; i++) {
  172. msg->addr = client->addr;
  173. msg->flags = 0;
  174. msg->len = 1;
  175. msg->buf = data;
  176. data[0] = reg[i];
  177. err = i2c_transfer(client->adapter, msg, 1);
  178. if(err<0) {
  179. printk( KERN_ERR " i2c_transfer(0x%x, %x)\n", msg->addr, msg->buf[0]);
  180. }
  181. if (err >= 0)
  182. {
  183. msg->flags = I2C_M_RD;
  184. msg->len = dataSize;
  185. err = i2c_transfer(client->adapter, msg, 1);
  186. if (err >= 0)
  187. {
  188. if(dataSize==1) {
  189. buffer[i] = data[0];
  190. } else
  191. if(dataSize==2) {
  192. buffer[2*i] = data[1];
  193. buffer[2*i+1] = data[0];
  194. }
  195. }
  196. }
  197. if (err<0)
  198. return -ENODEV;
  199. }
  200. return 0;
  201. }
  202. int I2C_write(I2C_Obj *pObj, uint8_t *reg, uint8_t *buffer, uint8_t count, uint8_t dataSize)
  203. {
  204. uint8_t i;
  205. int err;
  206. struct i2c_client *client;
  207. struct i2c_msg msg[1];
  208. unsigned char data[8];
  209. if(pObj==NULL)
  210. return -ENODEV;
  211. client = &pObj->client;
  212. if(!client->adapter)
  213. return -ENODEV;
  214. if(dataSize<=0||dataSize>4)
  215. return -1;
  216. for(i=0; i<count; i++) {
  217. msg->addr = client->addr;
  218. msg->flags= 0;
  219. msg->buf = data;
  220. data[0] = reg[i];
  221. if(dataSize==1) {
  222. data[1] = buffer[i];
  223. msg->len = 2;
  224. } else
  225. if(dataSize==2) {
  226. data[1] = buffer[2*i+1];
  227. data[2] = buffer[2*i];
  228. msg->len = 3;
  229. }
  230. err = i2c_transfer(client->adapter, msg, 1);
  231. if( err < 0 )
  232. return err;
  233. }
  234. return 0;
  235. }
  236. int I2C_devOpen(struct inode *inode, struct file *filp)
  237. {
  238. int minor, major;
  239. minor = iminor(inode);
  240. major = imajor(inode);
  241. #ifdef I2C_DEBUG
  242. printk(KERN_INFO "I2C: I2C_devOpen() , %4d, %2d \n", major, minor);
  243. #endif
  244. filp->private_data = NULL;
  245. return 0; /* success */
  246. }
  247. int I2C_devRelease(struct inode *inode, struct file *filp)
  248. {
  249. I2C_Obj *pObj;
  250. pObj = (I2C_Obj *)filp->private_data;
  251. if(pObj==NULL)
  252. return 0;
  253. #ifdef I2C_DEBUG
  254. printk(KERN_INFO "I2C: I2C_devRelease(), %x, %d \n", pObj->devAddr, pObj->users);
  255. #endif
  256. I2C_delete(pObj);
  257. return 0;
  258. }
  259. int I2C_devIoctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
  260. {
  261. I2C_Obj *pObj;
  262. int status=0;
  263. I2C_TransferPrm transferPrm;
  264. pObj = (I2C_Obj *)filp->private_data;
  265. #ifdef I2C_DEBUG
  266. printk(KERN_INFO "I2C: I2C_devIoctl() \n");
  267. #endif
  268. if(!I2C_IOCTL_CMD_IS_VALID(cmd))
  269. return -1;
  270. cmd = I2C_IOCTL_CMD_GET(cmd);
  271. down_interruptible(&gI2C_dev.semLock);
  272. switch(cmd)
  273. {
  274. case I2C_CMD_SET_DEV_ADDR:
  275. filp->private_data = I2C_create(arg);
  276. if(filp->private_data==NULL)
  277. status = -1;
  278. break;
  279. case I2C_CMD_WRITE:
  280. status = copy_from_user(&transferPrm, (void *)arg, sizeof(transferPrm));
  281. if(status==0) {
  282. status = copy_from_user(gI2C_dev.reg, transferPrm.reg, transferPrm.count);
  283. status |= copy_from_user(gI2C_dev.buffer, transferPrm.value, transferPrm.count*transferPrm.dataSize);
  284. if(status==0) {
  285. status = I2C_write(pObj, gI2C_dev.reg, gI2C_dev.buffer, transferPrm.count, transferPrm.dataSize);
  286. }
  287. }
  288. break;
  289. case I2C_CMD_READ:
  290. status = copy_from_user(&transferPrm, (void *)arg, sizeof(transferPrm));
  291. if(status==0) {
  292. status = copy_from_user(gI2C_dev.reg, transferPrm.reg, transferPrm.count);
  293. if(status==0) {
  294. status = I2C_read(pObj, gI2C_dev.reg, gI2C_dev.buffer, transferPrm.count, transferPrm.dataSize);
  295. if(status==0) {
  296. status = copy_to_user(transferPrm.value, gI2C_dev.buffer, transferPrm.count*transferPrm.dataSize);
  297. }
  298. }
  299. }
  300. break;
  301. default:
  302. status = -1;
  303. break;
  304. }
  305. up(&gI2C_dev.semLock);
  306. return status;
  307. }
  308. struct file_operations gI2C_devFileOps = {
  309. .owner = THIS_MODULE,
  310. .open = I2C_devOpen,
  311. .release = I2C_devRelease,
  312. .ioctl = I2C_devIoctl,
  313. };
  314. int I2C_devInit(void)
  315. {
  316. int result, i;
  317. dev_t dev = 0;
  318. #ifdef I2C_DEBUG
  319. printk(KERN_INFO "I2C: I2C_devInit() \n");
  320. #endif
  321. result = alloc_chrdev_region(&dev, 0, 1, I2C_DRV_NAME);
  322. if (result < 0) {
  323. printk(KERN_WARNING "I2C: can't get device major num \n");
  324. return result;
  325. }
  326. for(i=0; i<I2C_DEV_MAX_ADDR; i++)
  327. {
  328. gI2C_dev.pObj[i]=NULL;
  329. }
  330. gI2C_dev.major = MAJOR(dev);
  331. sema_init(&gI2C_dev.semLock, 1);
  332. cdev_init(&gI2C_dev.cdev, &gI2C_devFileOps);
  333. gI2C_dev.cdev.owner = THIS_MODULE;
  334. gI2C_dev.cdev.ops = &gI2C_devFileOps;
  335. result = cdev_add(&gI2C_dev.cdev, dev, 1);
  336. if (result)
  337. printk(KERN_WARNING "I2C: Error [%d] while adding device [%s] \n", result, I2C_DRV_NAME);
  338. printk(KERN_INFO "I2C: Module install successful, device major num = %d \n", gI2C_dev.major);
  339. return result;
  340. }
  341. void I2C_devExit(void)
  342. {
  343. dev_t devno = MKDEV(gI2C_dev.major, 0);
  344. #ifdef I2C_DEBUG
  345. printk(KERN_INFO "I2C: I2C_devExit() \n");
  346. #endif
  347. cdev_del(&gI2C_dev.cdev);
  348. unregister_chrdev_region(devno, 1);
  349. }
  350. 3.2 应用程序
  351. #include <drv_i2c.h>
  352. #include <dev_i2c.h>
  353. #include <sys/ioctl.h>
  354. #include <fcntl.h>
  355. #include <unistd.h>
  356. int DRV_i2cOpen(DRV_I2cHndl *hndl, Uint8 devAddr)
  357. {
  358. char deviceName[20];
  359. Uint32 cmd;
  360. int status;
  361. sprintf(deviceName, "/dev/%s", I2C_DRV_NAME);
  362. hndl->fd = open(deviceName, O_RDWR);
  363. if(hndl->fd<0)
  364. return OSA_EFAIL;
  365. cmd = I2C_IOCTL_CMD_MAKE(I2C_CMD_SET_DEV_ADDR);
  366. status = ioctl(hndl->fd, cmd, devAddr);
  367. if(status<0)
  368. close(hndl->fd);
  369. return status;
  370. }
  371. int DRV_i2cRead8(DRV_I2cHndl *hndl, Uint8 *reg, Uint8 *value, Uint8 count)
  372. {
  373. I2C_TransferPrm prm;
  374. Uint32 cmd;
  375. int status;
  376. prm.dataSize = 1;
  377. prm.reg = reg;
  378. prm.count = count;
  379. prm.value = value;
  380. cmd = I2C_IOCTL_CMD_MAKE(I2C_CMD_READ);
  381. status = ioctl(hndl->fd, cmd, &prm);
  382. return status;
  383. }
  384. int DRV_i2cWrite8(DRV_I2cHndl *hndl, Uint8 *reg, Uint8 *value, Uint8 count)
  385. {
  386. I2C_TransferPrm prm;
  387. Uint32 cmd;
  388. int status;
  389. prm.dataSize = 1;
  390. prm.reg = reg;
  391. prm.count = count;
  392. prm.value = value;
  393. cmd = I2C_IOCTL_CMD_MAKE(I2C_CMD_WRITE);
  394. status = ioctl(hndl->fd, cmd, &prm);
  395. return status;
  396. }
  397. int DRV_i2cRead16(DRV_I2cHndl *hndl, Uint8 *reg, Uint16 *value, Uint8 count)
  398. {
  399. I2C_TransferPrm prm;
  400. Uint32 cmd;
  401. int status;
  402. prm.dataSize = 2;
  403. prm.reg = reg;
  404. prm.count = count;
  405. prm.value = value;
  406. cmd = I2C_IOCTL_CMD_MAKE(I2C_CMD_READ);
  407. status = ioctl(hndl->fd, cmd, &prm);
  408. return status;
  409. }
  410. int DRV_i2cWrite16(DRV_I2cHndl *hndl, Uint8 *reg, Uint16 *value, Uint8 count)
  411. {
  412. I2C_TransferPrm prm;
  413. Uint32 cmd;
  414. int status;
  415. prm.dataSize = 2;
  416. prm.reg = reg;
  417. prm.count = count;
  418. prm.value = value;
  419. cmd = I2C_IOCTL_CMD_MAKE(I2C_CMD_WRITE);
  420. status = ioctl(hndl->fd, cmd, &prm);
  421. return status;
  422. }
  423. int DRV_i2cClose(DRV_I2cHndl *hndl)
  424. {
  425. return close(hndl->fd);
  426. }
  427. int DRV_i2cTestShowUsage(char *str)
  428. {
  429. OSA_printf(" \n");
  430. OSA_printf(" I2C Test Utility, \r\n");
  431. OSA_printf(" Usage: %s -r|-w <devAddrInHex> <regAddrInHex> <regValueInHex or numRegsToReadInDec> <regSizeInBytes>\r\n", str);
  432. OSA_printf(" \n");
  433. return 0;
  434. }
  435. int DRV_i2cTestMain(int argc, char **argv)
  436. {
  437. DRV_I2cHndl i2cHndl;
  438. Uint8 devAddr, numRegs;
  439. Bool doRead;
  440. Uint8 dataSize=1;
  441. int status, i;
  442. static Uint8 regAddr[256], regValue8[256];
  443. static Uint16 regValue16[256];
  444. if(argc<3) {
  445. DRV_i2cTestShowUsage(argv[0]);
  446. return -1;
  447. }
  448. if(strcmp(argv[1], "-r")==0)
  449. doRead=TRUE;
  450. else
  451. if(strcmp(argv[1], "-w")==0)
  452. doRead=FALSE;
  453. else {
  454. DRV_i2cTestShowUsage(argv[0]);
  455. return -1;
  456. }
  457. devAddr = 0;
  458. numRegs = 4;
  459. regValue8[0] = 0;
  460. regValue16[0] = 0;
  461. regAddr[0] = 0;
  462. if(argc>2)
  463. devAddr = xstrtoi(argv[2]);
  464. if(argc>3)
  465. regAddr[0] = xstrtoi(argv[3]);
  466. if(argc>5)
  467. dataSize = atoi(argv[5]);
  468. if(dataSize>2 || dataSize<=0)
  469. dataSize=1;
  470. if(argc>4) {
  471. if(doRead)
  472. numRegs = atoi(argv[4]);
  473. else {
  474. if(dataSize==1)
  475. regValue8[0] = xstrtoi(argv[4]);
  476. else
  477. if(dataSize==2)
  478. regValue16[0] = xstrtoi(argv[4]);
  479. }
  480. }
  481. if(devAddr==0) {
  482. OSA_printf(" I2C: Invalid device address\n");
  483. DRV_i2cTestShowUsage(argv[0]);
  484. return -1;
  485. }
  486. // OSA_printf(" I2C: Opening I2C at device address %x ...\n", devAddr);
  487. status = DRV_i2cOpen(&i2cHndl, devAddr);
  488. if(status != OSA_SOK) {
  489. OSA_ERROR("DRV_i2cOpen(%d)", devAddr);
  490. return status;
  491. }
  492. if(status==OSA_SOK)
  493. {
  494. #if 1
  495. if(doRead) {
  496. for(i=1; i<numRegs; i++)
  497. regAddr[i] = regAddr[0]+i;
  498. if(dataSize==1)
  499. status = DRV_i2cRead8(&i2cHndl, regAddr, regValue8, numRegs);
  500. else
  501. if(dataSize==2)
  502. status = DRV_i2cRead16(&i2cHndl, regAddr, regValue16, numRegs);
  503. OSA_printf(" \n");
  504. if(status==OSA_SOK) {
  505. for(i=0; i<numRegs; i++) {
  506. if(dataSize==1) {
  507. OSA_printf(" I2C: 0x%02x = 0x%02x \n", regAddr[i], regValue8[i] );
  508. } else
  509. if(dataSize==2)
  510. OSA_printf(" I2C: 0x%02x = 0x%04x \n", regAddr[i], regValue16[i] );
  511. }
  512. } else {
  513. OSA_printf(" I2C: Read ERROR !!!\n");
  514. }
  515. OSA_printf(" \n");
  516. } else {
  517. OSA_printf(" \n");
  518. if(dataSize==1) {
  519. status = DRV_i2cWrite8(&i2cHndl, regAddr, regValue8, 1);
  520. if(status==OSA_SOK) {
  521. status = DRV_i2cRead8(&i2cHndl, regAddr, regValue8, 1);
  522. }
  523. }
  524. else
  525. if(dataSize==2) {
  526. status = DRV_i2cWrite16(&i2cHndl, regAddr, regValue16, 1);
  527. if(status==OSA_SOK) {
  528. status = DRV_i2cRead16(&i2cHndl, regAddr, regValue16, 1);
  529. }
  530. }
  531. if(status==OSA_SOK) {
  532. if(dataSize==1) {
  533. OSA_printf(" I2C: 0x%02x = 0x%02x \n", regAddr[0], regValue8[0] );
  534. } else
  535. if(dataSize==2)
  536. OSA_printf(" I2C: 0x%02x = 0x%04x \n", regAddr[0], regValue16[0] );
  537. } else {
  538. OSA_printf(" I2C: Write ERROR !!!\n");
  539. }
  540. OSA_printf(" \n");
  541. }
  542. #endif
  543. DRV_i2cClose(&i2cHndl);
  544. }