找回密码
 立即注册

QQ登录

只需一步,快速开始

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

松翰SN8F5703单片机IIc例程

[复制链接]
跳转到指定楼层
楼主
ID:856645 发表于 2020-12-8 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
松翰单片机5703例程——IIC
  1. //-----------------------------------------------------------------------------
  2. //  FILE:   Master_I2C.c
  3. //-----------------------------------------------------------------------------
  4. //  Copyright 2014 SONiX Technology Corp. All rights reserved.
  5. //
  6. //  AUTHOR:     SONiX
  7. //  DATE:       2014/11/11
  8. //
  9. //  The program is an example of Master I2C to implement it.
  10. //   
  11. //  I2C decription:
  12. //      User need to external pull-high at SDA and SCL pin
  13. //
  14. //
  15. //  The system clock frequency is IHRC 32MHz
  16. //
  17. //  Device:     SN8F5708
  18. //  Tool chain: KEIL C51 V9.50a
  19. //
  20. //-----------------------------------------------------------------------------
  21. // Includes
  22. //-----------------------------------------------------------------------------
  23. #include <string.h>
  24. #include <SN8F5703.h>
  25. #include "GenericTypeDefs.h"
  26. //-----------------------------------------------------------------------------
  27. // Global Constants
  28. //-----------------------------------------------------------------------------
  29. #define MAXDATALEN  5
  30. //-----------------------------------------------------------------------------
  31. // Global Variables
  32. //-----------------------------------------------------------------------------
  33. UINT8 u8I2CFlag = 0;
  34. UINT8 u8I2CData[MAXDATALEN];
  35. UINT8 u8I2CAddr = 0;
  36. UINT8 u8I2CLen = 0;
  37. UINT8 u8I2CCnt = 0;
  38. //-----------------------------------------------------------------------------
  39. // Function Prototypes
  40. //-----------------------------------------------------------------------------
  41. void I2C_Init(void);
  42. UINT8 I2C_Master_Write_One_Byte(UINT8 u8Addr, UINT8 u8data);
  43. UINT8 I2C_Master_Write_N_Byte(UINT8 u8Addr, UINT8 *u8data, UINT8 u8size);
  44. UINT8 I2C_Master_Read_N_Byte(UINT8 u8Addr, UINT8 *u8data, UINT8 u8size);
  45. //-----------------------------------------------------------------------------
  46. // Main loop
  47. //-----------------------------------------------------------------------------
  48. void main(void)
  49. {
  50.     UINT8 u8TxData[MAXDATALEN] = {0xAA,0xBB,0xCC,0xDD,0xEE};                                                                                             // for test
  51.     UINT8 u8RxData[] = {0};
  52.     UINT8 u8SlaveAddr = 0x2C;                                                   // set addr

  53.                 CLKSEL = 0x06;                                                                                                                                                        // Fcpu = 32M/2 = 16M
  54.                 CLKCMD = 0X69;
  55.                 CKCON = 0X10;       
  56.                
  57.     WDTR = 0x5A;                                                                                                                            // clear watchdog if watchdog enable
  58.                
  59.                 P0 = 0;
  60.                 P0M = 0;
  61.                 P0UR = 0xFF;
  62.        
  63.                 P1 = 0;
  64.                 P1M = 0;
  65.                 P1UR = 0xFF;
  66.        
  67.                 P2 = 0;
  68.                 P2M = 0;
  69.                 P2UR = 0xFF;
  70.        
  71.                                        
  72.                 I2C_Init();   

  73.     // Write one data to slave
  74.                 I2C_Master_Write_One_Byte(u8SlaveAddr, u8TxData[0]);

  75.     // Write multi data to slave
  76.                 I2C_Master_Write_N_Byte(u8SlaveAddr, u8TxData, sizeof(u8TxData));

  77.                 // read 1 data form slave
  78.                 I2C_Master_Read_N_Byte(u8SlaveAddr, u8RxData, 1);
  79.                
  80.     // read multi data form slave
  81.                 I2C_Master_Read_N_Byte(u8SlaveAddr, u8RxData, sizeof(u8RxData));
  82.                
  83.     while (1)
  84.                 {
  85.                         WDTR = 0x5A;                                                                                                                        // clear watchdog if watchdog enable
  86.     }
  87. }
  88. //-----------------------------------------------------------------------------
  89. //  Function:   void I2C_Init(void)
  90. //  Description:
  91. //          SCL and SDA need to external pull high
  92. //-----------------------------------------------------------------------------
  93. void I2C_Init(void)
  94. {
  95.                 I2CCON = 0x43;                                                                                                                         // I2C enable (ENS1),Fclk = Fcpu/160 = 100K

  96.                 EI2C = 1;                                                                                                                       // I2C interrupt enable
  97.                 EAL = 1;                                                                                                                        // Interrupt enable
  98. }
  99. //-----------------------------------------------------------------------------
  100. //  Function:   UINT8 I2C_Master_Write_One_Byte(UINT8 u8Addr, UINT8 u8Data)
  101. //  Description:
  102. //
  103. //-----------------------------------------------------------------------------
  104. UINT8 I2C_Master_Write_One_Byte(UINT8 u8Addr, UINT8 u8Data)
  105. {
  106.     if (!u8I2CFlag) {
  107.         u8I2CFlag = 1;                                                                                              // get Use Right            
  108.         u8I2CLen = 1;                                                                                               // set length
  109.         u8I2CCnt = 0;                                                                                               // clear tx count
  110.         u8I2CData[0] = u8Data;
  111.         u8I2CAddr = u8Addr & 0xFE;                                                                                  // write mode               
  112.         I2CCON |= 0x20;                                                                                             // START (STA) = 1

  113.         while(u8I2CFlag);                                                                                           // wait Trasmit end

  114.         return TRUE;
  115.     }
  116.     else
  117.         return FALSE;
  118. }

  119. //-----------------------------------------------------------------------------
  120. //  Function:   UINT8 I2C_Master_Write_N_Byte(UINT8 u8Addr, UINT8 *u8data, UINT8 u8size)
  121. //  Description:
  122. //
  123. //-----------------------------------------------------------------------------
  124. UINT8 I2C_Master_Write_N_Byte(UINT8 u8Addr, UINT8 *u8data, UINT8 u8size)
  125. {
  126.     if (u8size > MAXDATALEN)   
  127.         return FALSE;                                                                                               // over buf size
  128.    
  129.     if (u8size == 0)   
  130.         return FALSE;                                                                                               // error size
  131.    
  132.     if (!u8I2CFlag) {
  133.         u8I2CFlag = 1;                                                                                      // get Use Right
  134.         u8I2CLen = u8size;                                                                                  // set length
  135.         u8I2CCnt = 0;                                                                                       // clear tx count
  136.         u8I2CAddr = u8Addr & 0xFE;                                                                          // write mode            
  137.         memcpy(u8I2CData, u8data, u8size);
  138.         I2CCON |= 0x20;                                                                                     // START (STA) = 1

  139.         while(u8I2CFlag);                                                                                   // wait Trasmit end

  140.         return TRUE;
  141.     }
  142.     else
  143.         return FALSE;
  144. }

  145. //-----------------------------------------------------------------------------
  146. //  Function:   UINT8 I2C_Master_Read_N_Byte(UINT8 u8Addr, UINT8 *u8data, UINT8 u8size)
  147. //  Description:
  148. //
  149. //-----------------------------------------------------------------------------
  150. UINT8 I2C_Master_Read_N_Byte(UINT8 u8Addr, UINT8 *u8data, UINT8 u8size)
  151. {
  152.     if (u8size > MAXDATALEN)   
  153.         return FALSE;                                                                                       // over buf size
  154.     if (u8size == 0)   
  155.         return FALSE;                                                                                       // error size
  156.     if (!u8I2CFlag) {
  157.         u8I2CFlag = 1;                                                                                      // get Use Right
  158.         u8I2CLen = u8size;                                                                                  // set length
  159.         u8I2CCnt = 0;
  160.         u8I2CAddr = u8Addr | 0x01;                                                                          // read mode
  161.         I2CCON |= 0x20;                                                                                     // START (STA) = 1
  162.    
  163.         while(u8I2CFlag);                                                                                   // wait recevier end
  164.    
  165.         memcpy(u8data, u8I2CData, u8size);
  166.    
  167.         return TRUE;
  168.     }
  169.     else
  170.         return FALSE;
  171. }
  172. //-----------------------------------------------------------------------------
  173. //  Function:   I2C interrupt
  174. //  Description:      
  175. //
  176. //-----------------------------------------------------------------------------
  177. void I2C_ISR(void) interrupt ISRI2c                                                                    // Vector @  0x43
  178. {
  179.     switch (I2CSTA)
  180.     {
  181.         // tx mode
  182.         case 0x08:
  183.             I2CCON &= 0xDF;                                                                     // START (STA) = 0
  184.             I2CDAT = u8I2CAddr;                                                                 // Tx/Rx addr
  185.             break;
  186.         case 0x18:                                                                              // write first byte
  187.             I2CDAT = u8I2CData[u8I2CCnt++];
  188.             u8I2CLen--;
  189.             break;
  190.         case 0x28:                                                                              // write n byte
  191.             if (u8I2CLen == 0) {                                                                // chk length if empty
  192.                 I2CCON |= 0x10;                                                                 // STOP (STO)
  193.                 u8I2CFlag = 0;
  194.                 u8I2CCnt = 0;
  195.             }
  196.             else {
  197.                 I2CDAT = u8I2CData[u8I2CCnt++];
  198.                 u8I2CLen--;
  199.             }
  200.             break;
  201.             
  202.         //    rx mode   
  203.         case 0x40:                                                                              // get slave addr
  204.             if(u8I2CLen > 1)        I2CCON |= 0x04;         // AA = 1
  205.                                                 else        I2CCON &= 0xFB;  
  206.             break;
  207.         case 0x50:                                                                              // read n byte
  208.             u8I2CData[u8I2CCnt++] = I2CDAT;
  209.             if (u8I2CCnt == (u8I2CLen-1)) {
  210.                 I2CCON &= 0xFB;                                                                 // AA = 0
  211.             }
  212.             else {               
  213.                 I2CCON |= 0x04;                                                                        // AA = 1
  214.             }
  215.             break;
  216.         case 0x58:                                                                              // read last byte & stop
  217.             u8I2CData[u8I2CCnt] = I2CDAT;
  218.             I2CCON |= 0x10;                                                                     // STOP (STO)
  219.             u8I2CFlag = 0;
  220.             break;
  221.         default:
  222.             I2CCON |= 0x10;                                                                     // STOP (STO)
  223.             u8I2CFlag = 0;
  224.     }
  225.                
  226.     I2CCON &= 0xF7;                                                                             // Clear I2C flag (SI)        
  227. }
复制代码


5703_I2C_20161104.rar

115.79 KB, 下载次数: 10, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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