[资料分享] 最新的MSP430普通IO模拟IIC程序!

空气   2009-10-30 12:02 楼主

  1. #include
  2. #include
  3. #include
  4. #include
  5. //------------------------------------------
  6. #define IicWpDirOut P6DIR |= BIT5
  7. #define IicWpLow P6OUT &=~ BIT5
  8. #define IicWpHig P6OUT |= BIT5

  9. #define IicSclDirOut P6DIR |= BIT6
  10. #define IicSclLow P6OUT &=~ BIT6
  11. #define IicSclHig P6OUT |= BIT6
  12. #define IicSdaDirOut P6OUT &= ~BIT7
  13. #define IicSdaLow P6DIR |= BIT7
  14. #define IicSdaHig P6DIR &=~ BIT7
  15. #define IicSdaInSt P6IN & BIT7
  16. bool AckErr;
  17. //------------------------------ *** - 时间延时 - *** ------------------------------//
  18. void Delay(unsigned int count)
  19. {
  20. unsigned int i;
  21. _NOP();
  22. _NOP();
  23. for(i=count; i>0; i--);
  24. }
  25. void IIcDelay(void)
  26. {
  27. _NOP();
  28. }
  29. //-----***-IIC初始化-***-----//
  30. void IicInit(void)
  31. {
  32. IicWpDirOut;
  33. IicSdaDirOut;
  34. IicSclDirOut;
  35. IicWpHig;
  36. IicSdaHig;
  37. IicSclHig;
  38. }
  39. //-----***-IIC启示-***-----//
  40. void IicStart(void)
  41. {
  42. IicSdaHig;//IicSda=1;
  43. IIcDelay();
  44. IicSclHig;//IicScl=1;
  45. IIcDelay();
  46. IicSdaLow;//IicSda=0;
  47. IIcDelay();
  48. IicSclLow;//IicScl=0;
  49. IIcDelay();
  50. }
  51. //-----***-IIC停止-***-----//
  52. void IicStop(void)
  53. {
  54. IicSdaLow;//IicSda=0;
  55. IIcDelay();
  56. IicSclHig;//IicScl=1;
  57. IIcDelay();
  58. IicSdaHig;//IicSda=1;
  59. IIcDelay();
  60. }
  61. //-----***-IIC应答-***-----//
  62. void SendAcknowledge(bool ack)
  63. {
  64. IicSdaDirOut;
  65. if(ack)//IicSda=ack;
  66. {
  67. IicSdaHig;
  68. }
  69. else
  70. {
  71. IicSdaLow;
  72. }
  73. IIcDelay();
  74. IicSclHig;//IicScl=1;
  75. IIcDelay();
  76. IicSclLow;//IicScl=0;
  77. IIcDelay();
  78. }
  79. //-----***-从slave端读取一个数据-***-----//
  80. unsigned char IicReceiveByte(void)
  81. {
  82. unsigned char i;
  83. unsigned char bytedata=0;

  84. IicSdaDirOut;
  85. IicSdaHig;//IicSda=1;
  86. for(i=0;i<8;i++) { IicSclHig;//IicScl=1; IIcDelay(); bytedata<<=1; if(IicSdaInSt) { bytedata |=0x01; } else { bytedata &=0xfe; } IicSclLow;//IicScl=0; IIcDelay(); } IicSdaDirOut; return bytedata; } //-----***-传送一个 Byte 数据到 slave-***-----// void IicSentByte(unsigned char DataByte) { unsigned char i; for(i=0;i<8;i++) { if(DataByte & 0x80) { IicSdaHig;//IicSda=1; } else { IicSdaLow;//IicSda=0; } DataByte <<=1; IIcDelay(); IicSclHig;//IicScl=1; IIcDelay(); IicSclLow;//IicScl=0; IIcDelay(); } IicSdaHig;//IicSda=1;-----Y------D---IicSdaDirIn IIcDelay(); IicSclHig;//IicScl=1; IIcDelay(); IicSclLow;//IicScl=0; IIcDelay(); } //-----***-无扇区读---多字节-***-----// //读取指定器件无扇区指定地址多字节数据到指定地址 //Device=器件地址---单字节 //DataAdd=字节地址---单字节 void IicMuchByteRead(unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend) { unsigned char i; _DINT(); WDT(); IicInit(); IicStart(); IicSentByte(0xa0); IicSentByte(DataAdd); IicStart(); IicSentByte(0xa1); for(i=DataLend-1;i>0;i--)
  87. {
  88. *DataDptr=IicReceiveByte();
  89. DataDptr++;
  90. SendAcknowledge(0);
  91. }
  92. *DataDptr=IicReceiveByte();
  93. SendAcknowledge(1);
  94. IicStop();
  95. WDT();
  96. Delay(500);
  97. _EINT();
  98. }
  99. //-----***-无扇区写---多字节-***-----//
  100. //写入指定器件无扇区指定地址中的多字节数据
  101. //Device=器件地址---单字节
  102. //DataAdd=字节地址---双字节
  103. //DataByte=被存放数据的地址
  104. //DataLend=被存放数据的长度
  105. void IicMuchByteWrite(unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
  106. {
  107. unsigned char i;
  108. _DINT();
  109. WDT();
  110. IicInit();
  111. IicWpLow;
  112. IicStart();
  113. IicSentByte(0xa0);
  114. IicSentByte(DataAdd);
  115. for(i=DataLend;i>0;i--)
  116. {
  117. IicSentByte(*DataDptr);
  118. DataDptr++;
  119. }
  120. IicStop();
  121. WDT();
  122. Delay(3500);
  123. IicWpHig;
  124. _EINT();
  125. }

  126. //---特别说明
  127. //---利用430芯片来模拟IIC,是不能够把SDA设置为输出模式而是
  128. //---设置为输入,然后利用方向控制器来输出高或者低
  129. //---如下:
  130. #define IicSdaDirOut P6OUT &= ~BIT7
  131. #define IicSdaLow P6DIR |= BIT7
  132. #define IicSdaHig P6DIR &=~ BIT7
  133. #define IicSdaInSt P6IN & BIT7


 

回复评论 (17)

还没有用到过,先收藏了,谢谢楼主
加油学习,努力提高
点赞  2010-10-18 15:49

谢谢楼主分享

谢谢楼主分享,还没有用到过,先收藏了,谢谢楼主
点赞  2011-2-17 20:32
谢谢楼主分享,先收藏了,谢谢楼主
点赞  2011-4-5 00:26
现在贴代码好漂亮啊,是新功能吗?
点赞  2011-4-6 15:21

谢了,收下先

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-4-7 05:53

回复 楼主 空气 的帖子

正好做这块,收藏试试,
点赞  2011-9-23 11:03
不错,谢谢楼主了!
点赞  2011-9-23 14:23
收藏了,谢谢楼主
点赞  2011-9-23 14:43
先mark一下,等会慢慢看。。
点赞  2011-9-27 10:34

楼主辛苦,感谢分享……

点赞  2011-11-10 14:50

能用吗?

确定这个程序能用吗?
点赞  2012-12-18 14:34

这个必须顶,,,

这个必须顶,,,这个必须顶,,,
点赞  2012-12-18 16:29
这么多人MARK了,有人试过能用吗?
点赞  2012-12-18 17:56
写的很工整 啊,这两天试一试。
点赞  2013-5-13 22:27
好资料
点赞  2013-8-27 09:54
点赞  2013-11-29 19:07
收藏!谢谢楼主!
点赞  2015-8-2 14:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复