久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2636|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产丝袜人妖cd露出 | 欧美一区二区成人 | 亚洲视频在线看 | 北条麻妃视频在线观看 | 老司机狠狠爱 | 夜夜爽99久久国产综合精品女不卡 | 亚洲综合色站 | 亚洲欧美中文字幕在线观看 | 黄色毛片在线观看 | 欧美黄色免费网站 | 亚洲va欧美va人人爽午夜 | 九九伦理电影 | 国产9 9在线 | 中文 | 欧美日韩一区二区在线观看 | 日韩精品在线一区 | 黑人巨大精品欧美黑白配亚洲 | 国产小视频在线 | 国产成人精品视频在线观看 | 91在线一区二区三区 | 国产精品欧美精品日韩精品 | 欧美日韩亚洲在线 | 国产欧美久久精品 | 成年人在线视频 | 亚洲成人一区 | 草草草影院 | 国产一二三视频在线观看 | 天堂网中文字幕在线观看 | 在线成人www免费观看视频 | 91 中文字幕 | 亚洲一区二区三区欧美 | 国产黄色小视频在线观看 | 亚洲成人精品久久 | 国产精品成人国产乱 | 日韩电影中文字幕 | 婷婷色在线播放 | 国产成人高清视频 | 日本特黄特色aaa大片免费 | 午夜在线免费观看 | 亚洲精品成人av久久 | 国产高清视频一区 | 91性高湖久久久久久久久_久久99 |