找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3733|回复: 2
打印 上一主题 下一主题
收起左侧

SI7021普通IO口模拟I2C例程

[复制链接]
跳转到指定楼层
楼主
ID:358890 发表于 2018-6-25 22:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SI7021 普通IO口模拟I2C例程 兼容Si705x

单片机源程序如下:
  1. /*-----------------------------------------------------------------------------
  2. *
  3. * Project:        Silicon Labs Si7005 UDP Demo
  4. *
  5. *
  6. * File Name:      I2C.c
  7. *
  8. * Description:    Use the I2C protocol to read and write registers on a device
  9. *
  10. * Revision History:
  11. *
  12. *   09/17/12  QHS  Initial Release
  13. *
  14. *----------------------------------------------------------------------------*/

  15. #include <compiler_defs.h>
  16. #include <C8051F960_defs.h>
  17. #include "Tick.h"
  18. #include "I2C.h"


  19. /* Maximum time to wait for a transfer to complete */
  20. #define MAX_XFER_TIME   300  /* ms */

  21. /* Maximum number of data bytes that can be read or written */
  22. #define MAX_XFER_LENGTH  2

  23. /* Number of I2C buses */
  24. #define I2C_BUS_COUNT  2

  25. /* Transfer request */
  26. typedef struct
  27. {
  28.    U8 Type;
  29.    U8 Status;
  30.    U8 Bus;
  31.    U8 Address;
  32.    U8 Length;   /* 0,1,2 */
  33.    U8 Data[MAX_XFER_LENGTH];
  34. } XFER;

  35. /* Transfer type */
  36. #define XFER_TYPE_WRITE          0x10
  37. #define XFER_TYPE_READ           0x20
  38. #define XFER_TYPE_WRITE_READ    (XFER_TYPE_WRITE|XFER_TYPE_READ)

  39. /* Transfer status */
  40. #define XFER_STATUS_NONE         0x00
  41. #define XFER_STATUS_SUCCESS      0x01
  42. #define XFER_STATUS_ADDR_NAK     0x02
  43. #define XFER_STATUS_DATA_NAK     0x03
  44. #define XFER_STATUS_TIMEOUT      0x04
  45. #define XFER_STATUS_ARBLOST      0x05
  46. #define XFER_STATUS_BAD_LENGTH   0x06
  47. #define XFER_STATUS_BAD_MODE     0x07
  48. #define XFER_STATUS_BAD_STATE    0x08

  49. /* Prototypes */
  50. //void I2C_Transfer( void );

  51. /* Global variables */
  52. XFER Transfer;
  53. U8   DataCount;
  54. U8   CurrentBus = I2C_BUS_1;
  55. U16  TransferStatus[8]={0};
  56. U16  TransferStartTime;


  57. /*****************************************************************************/
  58. /* I2C_Init                                                                  */
  59. /*****************************************************************************/

  60. void I2C_Init( void )
  61. {
  62.    SFRPAGE = LEGACY_PAGE;

  63.    /* Enable SMBus on the crossbar */
  64.    XBR0 = 0x04;
  65.    XBR2 = 0x40;

  66.    /* Move SMBus to P1.5 and P1.6 for bus 1 */
  67.    P0SKIP = 0xFF;
  68.    P1SKIP = 0x1F;

  69.    /* Configure SMBus */
  70.    SMB0CF = 0xDC;

  71.    /* Timer 0 uses SYSCLK */
  72.    CKCON |= 0x04;

  73.    /* Configure timer 0 for SMBus bit rate (200 kHz) */
  74.    TCON  = 0x10;
  75.    TMOD  = 0x32;
  76.    TH0   = 0xDF;
  77.    
  78.    /* Configure timer 3 for SCL low timeout (25ms) */
  79.    TMR3CN  = 0x04;
  80.    TMR3RLH = 0x5D;
  81.    TMR3RLL = 0x3D;
  82.    
  83.    /* Enable SMBus and timer 3 interrupts */
  84.    EIE1 |= 0x81;
  85. }
  86.    


  87. #define SDIO_OUT P1MDOUT
  88. #define SDIO_HEX 0x20
  89. #define SCLK_HEX 0x40





  90. //-----------------------------------------------------------------------------
  91. // Defines
  92. //-----------------------------------------------------------------------------
  93. #define READ    1
  94. #define WRITE   0

  95. #define IO2W_SENB0_ADDRESS 0x22
  96. #define IO2W_SENB1_ADDRESS 0x40//0xC6

  97. //-----------------------------------------------------------------------------
  98. // Global variables
  99. //-----------------------------------------------------------------------------

  100. //-----------------------------------------------------------------------------
  101. // Function prototypes
  102. //-----------------------------------------------------------------------------

  103. void _nop_(void);


  104. //-----------------------------------------------------------------------------
  105. // Externals
  106. //-----------------------------------------------------------------------------


  107. //-----------------------------------------------------------------------------
  108. // This is used just for debugging to detect when the si47xx is not responding.
  109. // The 47xx should always ack 2-wire transactions.  If it does not, there is a
  110. // hardware problem that must be resolved.
  111. //-----------------------------------------------------------------------------
  112. static void die(void)
  113. {
  114.     _nop_(); // put breakpoint here during debug.
  115. }

  116. void start(void)
  117. {
  118.         SDIO_OUT |= SDIO_HEX;  // Configure SDIO as push-pull
  119.         wait_us(1);
  120.         SCLK =1;
  121.         wait_us(1);       
  122.         SDIO=1;
  123.         wait_us(5);
  124.         SDIO=0;
  125.         wait_us(5);
  126.         SCLK =0;
  127.         wait_us(50);
  128. }

  129. //-----------------------------------------------------------------------------
  130. // Send a 2-wire stop.  A STOP condition is defined as a low to high transition
  131. // on the SDIO pin while SCLK is high.
  132. //
  133. // Pin drive status upon exit:
  134. //      SDIO = high (open-drain input)
  135. //      SCLK = high
  136. //-----------------------------------------------------------------------------
  137. void io2w_stop(void)
  138. {
  139.     SDIO_OUT |= SDIO_HEX;  // Configure SDIO as push-pull
  140.         SCLK = 0;
  141.     wait_us(5); // tf:IN + tLOW
  142.     SDIO = 0;
  143.     wait_us(5);
  144.     SCLK = 1;
  145.     wait_us(3); // tf:IN + tSU:STO
  146.     SDIO = 1;
  147. }
  148. //-----------------------------------------------------------------------------
  149. // Write one byte of data.
  150. //
  151. // Inputs:
  152. //                wrdata:  Byte to be written
  153. //
  154. // Pin drive status upon exit:
  155. //      SDIO = high (open-drain input)
  156. //      SCLK = high
  157. //-----------------------------------------------------------------------------
  158. void io2w_write_byte(U8 wrdata)
  159. {
  160.     S8 i,Status;

  161.     SDIO_OUT |= SDIO_HEX;  // Configure SDIO as push-pull
  162.     for ( i = 7; i >= 0; i-- )
  163.     {
  164.         SCLK = 0;
  165.         wait_us(1); // tf:IN
  166.         SDIO = ((wrdata >> i) & 0x01);
  167.         wait_us(2); // tLOW
  168.         SCLK = 1;
  169.         wait_us(1); // tf:IN + tHIGH
  170.     }
  171.         Status=Slave_acknowledge();
  172. }
  173. //-----------------------------------------------------------------------------
  174. // check the acknowledge
  175. //
  176. // Inputs:
  177. //                wrdata:  Byte to be written
  178. //
  179. // Pin drive status upon exit:
  180. //      SDIO = high (open-drain input)
  181. //      SCLK = high
  182. //-----------------------------------------------------------------------------
  183. U8 Slave_acknowledge(void)
  184. {
  185.         U8 i=0;
  186. // check the acknowledge
  187.         SDIO_OUT &= ~(SDIO_HEX);  // Configure SDIO as open-drain
  188.     SCLK = 0;
  189.     SDIO = 1;   // Configure P0^7(SDIO) as a digital input
  190.     wait_us(2); // tf:IN + tLOW
  191.     SCLK = 1;
  192.     wait_us(1); // tf:IN + tHIGH
  193.         SCLK = 0;
  194.         wait_us(1);       

  195.     while (SDIO !=0)
  196.         {
  197.                 i++;
  198.           if(i>250)
  199.                   return 0;  // ack not received.  This should never happen. Device isn't responding.
  200.         }
  201.       
  202.         return 1;
  203. }


  204. void Master_acknowledge(void)
  205. {
  206.     // set the acknowledge
  207.     SCLK = 0;

  208.     SDIO_OUT |= SDIO_HEX;   // Configure SDIO as push-pull
  209.     SDIO = 0;
  210.     wait_us(1); // tf:IN + tLOW
  211.     SCLK = 1;
  212.     wait_us(1); // tf:IN + tHIGH
  213. }
  214. //-----------------------------------------------------------------------------
  215. // Read one byte of data.
  216. //
  217. // Inputs:
  218. //                remaining bytes:  Zero value indicates an ack will not be sent.
  219. //
  220. // Outputs:
  221. //                 Returns byte read
  222. //
  223. // Pin drive status upon exit:
  224. //      SDIO = high (open-drain input) if no more bytes to be read
  225. //      SDIO = low (open-drain input) if read is to continue
  226. //      SCLK = high
  227. //-----------------------------------------------------------------------------
  228. U8 io2w_read_byte(void)
  229. {
  230.     S8 i;
  231.     U8 rddata = 0;

  232.     SDIO_OUT &= ~(SDIO_HEX);  // Configure SDIO as open-drain
  233.     for( i = 7; i >= 0; i-- )
  234.     {
  235.         SCLK = 0;
  236.         SDIO = 1;                        // Configure P0^7(SDIO) as a digital input
  237.         wait_us(1);                      // tf:IN
  238. ……………………

  239. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
SI7021 普通IO口模拟I2C例程 兼容Si705x.rar (261.29 KB, 下载次数: 17)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:461266 发表于 2019-12-15 13:27 | 只看该作者
兼不兼容STC15W系列?
回复

使用道具 举报

板凳
ID:185372 发表于 2020-6-28 09:47 | 只看该作者
不知道直接使用硬件的i2c怎么样,先研究一下,感谢。主要是在学习这个温湿度检测芯片。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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