[电路设计] 有木有人 改写过官方的I2C库函数~

[复制链接]
3064|7
 楼主| kyzb001 发表于 2011-12-6 11:32 | 显示全部楼层 |阅读模式
官方的I2C库函数 好蛋疼啊!
有没有那位牛人改过.......


  1. void DrcI2C_WriteByte(uint32_t address,uint8_t data )
  2. {
  3. uint32_t i;
  4. SystemCoreClock = DrvSYS_GetHCLKFreq();
  5.   //Open I2C1 and set clock = 50Kbps
  6. if(DrvI2C_Open(I2C_PORT1, 50000))
  7.   printf("Open i2c1 fail.\n");

  8.     //send i2c start
  9. DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0); //set start
  10. while (I2C1->I2CON.SI == 0);   //poll si flag
  11. //send writer command
  12. I2C1->I2CDAT = 0x78;     //send writer command
  13.     DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, ); //clr si flag
  14.     while( I2C1->I2CON.SI == 0 );      //poll si flag
  15. // //send address high
  16. // I2C1->I2CDAT = (address>>8)&0XFF;
  17. // DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack
  18. // while( I2C1->I2CON.SI == 0 );   //poll si flag
  19. // //send address low
  20. // I2C1->I2CDAT = address&0XFF;
  21. // DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack
  22. // while( I2C1->I2CON.SI == 0 );   //poll si flag
  23. //send data
  24. I2C1->I2CDAT = data;     //write data to
  25. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack
  26. while( I2C1->I2CON.SI == 0 );   //poll si flag
  27.     //send i2c stop
  28. DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //send stop
  29. while( I2C1->I2CON.STO);
  30. //while( I2C1->CON.SI == 0 );
  31. for(i=0;i<60;i++);
  32. DrvI2C_Close(I2C_PORT1);
  33.    
  34. for(i=0;i<6000;i++);
  35. for(i=0;i<6000;i++);
  36. }
  37. uint8_t DrcI2C_ReadByte(uint32_t address)
  38. {
  39. uint8_t TEMP;
  40.   //Open I2C1 and set clock = 50Kbps
  41. SystemCoreClock = DrvSYS_GetHCLKFreq();
  42. DrvI2C_Open(I2C_PORT1, 50000);
  43. //send i2c start
  44.     DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);   //set start
  45. while (I2C1->I2CON.SI == 0);    //poll si flag
  46.   
  47.     //send writer command
  48. I2C1->I2CDAT = 0XA0;
  49.     DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si
  50.     while( I2C1->I2CON.SI == 0 );      //poll si flag

  51. //send address high
  52.     I2C1->I2CDAT = (address>>8)&0XFF;
  53. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si and set ack
  54. while( I2C1->I2CON.SI == 0 );      //poll si flag
  55.    
  56. //send address low
  57. I2C1->I2CDAT = address&0XFF;
  58. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si and set ack
  59. while( I2C1->I2CON.SI == 0 );      //poll si flag

  60. //send start flag
  61. DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);    //clr si and send start
  62. while( I2C1->I2CON.SI == 0 );      //poll si flag

  63. //send read command
  64. I2C1->I2CDAT = 0XA1;
  65. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si
  66.     while( I2C1->I2CON.SI == 0 );      //poll si flag
  67. //resive data
  68. I2C1->I2CDAT = 0XFF;
  69. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si
  70. while( I2C1->I2CON.SI == 0 );      //poll si flag
  71. TEMP= I2C1->I2CDAT;
  72. //send i2c stop
  73.   DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0);    //clr si and set stop
  74. while( I2C1->I2CON.STO);
  75. DrvI2C_Close(I2C_PORT1);
  76. return TEMP;
  77. }

  78. 这.......看着就蛋疼

  79. 比较一下STM32的



  80. [code]uint8_t I2C_7588lcd_Write(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)
  81. {
  82. unsigned int i;
  83. uint32_t u32delayno;

  84. I2C_GenerateSTART(I2C_MASTER, ENABLE); //启动I2C

  85. u32delayno=0;
  86. while(!I2C_CheckEvent(I2C_MASTER, I2C_EVENT_MASTER_MODE_SELECT)); //等待响应,超时退出,放置死循
  87. //发送器件地址
  88. I2C_Send7bitAddress(I2C_MASTER, 0x78, I2C_Direction_Transmitter);

  89. u32delayno=0;
  90. while(!I2C_CheckEvent(I2C_MASTER, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) //等待器件响应
  91. {
  92. u32delayno++;
  93. if ( u32delayno >= I2C_TIME_OUT )
  94. {
  95. USART1_Puts("error:send address\n");
  96. return ERROR;
  97. }
  98. }
  99. while(NumByteToWrite--)
  100. { //写数据

  101. I2C_SendData(I2C_MASTER, *pBuffer);
  102. //发送数据
  103. pBuffer++;

  104. for(i=50;i>0;i--) //等待器件响应 LCD答应ACK有点BUG所以这里采用延时
  105. {
  106. __nop();
  107. }

  108. }
  109. I2C_GenerateSTOP(I2C_MASTER, ENABLE);
  110. //停止I2C
  111. return SUCCESS;

  112. }
[/code]
 楼主| kyzb001 发表于 2011-12-6 11:34 | 显示全部楼层
特别是这个函数写的......要多晕就有多晕
DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);

有木有人改写过.....
Ryanhsiung 发表于 2011-12-6 11:41 | 显示全部楼层
我没有改写,但是我将DrvI2C_Ctrl 都封装起来了

https://bbs.21ic.com/icview-292158-1-1.html
 楼主| kyzb001 发表于 2011-12-6 12:21 | 显示全部楼层
nuc这个 芯片 用的真是无比的蛋疼啊!!!!
Ryanhsiung 发表于 2011-12-6 12:48 | 显示全部楼层
nuc这个 芯片 用的真是无比的蛋疼啊!!!!
kyzb001 发表于 2011-12-6 12:21

还好,只是文档做的很不好而以!
 楼主| kyzb001 发表于 2011-12-6 14:29 | 显示全部楼层
还好,只是文档做的很不好而以!
Ryanhsiung 发表于 2011-12-6 12:48


就指的是文档...要大叔不弄那个群。 文档要更加蛋疼!
hotpower 发表于 2011-12-7 08:47 | 显示全部楼层
这个例程可以说是最臭的,因为它没表达iic的真缔。误导。
Ryanhsiung 发表于 2011-12-7 09:14 | 显示全部楼层
就指的是文档...要大叔不弄那个群。 文档要更加蛋疼!
kyzb001 发表于 2011-12-6 14:29


I2C status 寄存器就没有列出意义
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部