OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7093|回复: 13

I2C总线万能程序C语言-备忘录

[复制链接]

80

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
406
金钱
406
注册时间
2018-11-20
在线时间
25 小时
发表于 2019-8-1 15:05:46 | 显示全部楼层 |阅读模式

在其他地方看到这个不错的代码,希望对大家能够有所帮助


  1. "reg51.h"
  2. #include "intrins.h"
  3. unsigned char SystemError;
  4. sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义
  5. sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的?枰?炊ㄒ?
  6. #define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
  7. /*--------------------------------------------------------------------------------
  8. 调用方式:void AD7416_I2CStart(void) 2003/05/04
  9. 函数说明:私有函数,I2C专用
  10. ---------------------------------------------------------------------------------*/
  11. 本帖隐藏的内容void I2CStart(void)
  12. {
  13. EA=0;
  14. SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
  15. SDA=0; SomeNOP();
  16. SCL=0;
  17. }
  18. /*--------------------------------------------------------------------------------
  19. 调用方式:void AD7416_I2CStop(void) 2003/05/04
  20. 函数说明:私有函数,I2C专用
  21. ---------------------------------------------------------------------------------*/
  22. void I2CStop(void)
  23. {
  24. SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
  25. SCL=1; SomeNOP(); SDA=1;
  26. EA=1;
  27. }
  28. /*--------------------------------------------------------------------------------
  29. 调用方式:I2CAck(void) 2003/05/13
  30. 函数说明:私有函数,I2C专用,等待从器件接收方的应答
  31. ACK BY AD7416
  32. ---------------------------------------------------------------------------------*/
  33. WaitAck(void)
  34. {
  35. unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
  36. SDA=1;
  37. SCL=1;
  38. SystemError=0x10;
  39. while(SDA)
  40. { errtime--;
  41. IF(!errtime)
  42. { AD7416_I2CStop();
  43. AD7416_SystemError=0x11; //出错后给全局变量赋值
  44. return;
  45. }
  46. }
  47. SCL=0;
  48. }
  49. /*--------------------------------------------------------------------------------
  50. 调用方式:void SendAck(void) ﹫2003/05/13
  51. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
  52. ---------------------------------------------------------------------------------*/
  53. void SendAck(void)
  54. {
  55. SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
  56. SCL=1; SomeNOP();
  57. SCL=0;
  58. }
  59. /*--------------------------------------------------------------------------------
  60. 调用方式:void SendAck(void) ﹫2003/05/13
  61. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
  62. --------------------------------------------------------------------------------*/
  63. void SendNotAck(void)
  64. {
  65. SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
  66. SCL=1; SomeNOP();
  67. SCL=0;
  68. }
  69. /*--------------------------------------------------------------------------------
  70. 调用方式:void I2CSend(uchar ch) 2003/05/13
  71. 函数说明:私有函数,I2C专用
  72. ---------------------------------------------------------------------------------*/
  73. void I2CSendByte(Byte ch)
  74. {
  75. unsigned char i=8;
  76. while (i--)
  77. {
  78. SCL=0;_nop_();
  79. SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //时钟保持低可以发送数据
  80. SCL=1; SomeNOP();
  81. }
  82. SCL=0;
  83. }
  84. /*--------------------------------------------------------------------------------
  85. 调用方式:uchar I2CReceive(void) 2003/05/13
  86. 函数说明:私有函数,I2C专用
  87. ---------------------------------------------------------------------------------*/
  88. Byte I2CReceiveByte(void)
  89. {
  90. unsigned char i=8,data=0;
  91. SDA=1;
  92. while (i--)
  93. {
  94. data<<=1;
  95. SCL=0;SomeNOP();
  96. SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据
  97. data|=SDA;
  98. }
  99. SCL=0;
  100. return data;
  101. }
复制代码
给大家提供了一段程序大家有需要的可以拿去用,下边也为大家分享了一点资料希望能够有所帮助。




linux设备驱动之I2C驱动框架
http://www.makeru.com.cn/live/2668_1497.html?s=45051
游客,如果您要查看本帖隐藏内容请回复




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-8-3
在线时间
0 小时
发表于 2019-8-3 23:42:55 | 显示全部楼层
回复 支持 反对

使用道具 举报

8

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-6-18
在线时间
25 小时
发表于 2019-9-19 15:01:30 | 显示全部楼层
总线万能程序
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2018-12-12
在线时间
25 小时
发表于 2019-9-20 16:51:18 | 显示全部楼层
Thanks for your share
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-4-22
在线时间
2 小时
发表于 2019-9-22 13:17:18 | 显示全部楼层
6666666666666
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2018-6-9
在线时间
5 小时
发表于 2019-9-25 17:20:47 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

2

主题

56

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1394
金钱
1394
注册时间
2014-12-31
在线时间
187 小时
发表于 2019-10-22 15:39:22 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-10-23 19:57:25 | 显示全部楼层
哎,直播课????????
成功没有捷径
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-2-1
在线时间
19 小时
发表于 2019-11-17 20:34:04 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2019-11-19 15:09:22 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-12-6
在线时间
0 小时
发表于 2019-12-6 13:54:46 | 显示全部楼层
很好!!!!!!!!!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-10-22
在线时间
9 小时
发表于 2019-12-15 11:28:46 | 显示全部楼层
谢谢楼主分享!
回复 支持 反对

使用道具 举报

14

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2012-3-13
在线时间
16 小时
发表于 2020-2-16 14:42:23 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-1-17
在线时间
31 小时
发表于 2020-2-26 11:07:22 | 显示全部楼层
hello world
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 09:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表