找回密码
 立即注册
查看: 197|回复: 5

STC8的硬件IIC怎么样

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 11:31:22
已绑定手机

2

主题

3

回帖

20

积分

新手上路

积分
20
发表于 2026-1-23 17:37:35 | 显示全部楼层 |阅读模式
请教一下,STC8系列的单片机硬件I2C怎么样?

计划使用STC8G1K08A,用来给其他IC加载初始化配置,需要发送的内容大概五百多字节。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:483
  • 最近打卡:2026-03-23 08:55:58
已绑定手机

104

主题

4195

回帖

9307

积分

荣誉版主

无情的代码机器

积分
9307
发表于 2026-1-23 18:47:26 | 显示全部楼层
好,够用
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:645
  • 最近打卡:2026-03-23 15:27:18

33

主题

2912

回帖

6555

积分

论坛元老

积分
6555
发表于 2026-1-24 09:15:56 | 显示全部楼层
可以用
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:542
  • 最近打卡:2026-03-23 00:04:26
已绑定手机

14

主题

154

回帖

207

积分

中级会员

积分
207
发表于 2026-1-24 11:06:11 | 显示全部楼层
好用
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:838
  • 最近打卡:2026-03-23 06:19:26

12

主题

1328

回帖

7148

积分

论坛元老

积分
7148
发表于 2026-1-24 12:01:19 | 显示全部楼层
  1. //20.5.6 测试 I2C 从机模式代码的主机代码
  2. //测试工作频率为 11.0592MHz
  3. #include "reg51.h"
  4. #include "intrins.h"
  5. sfr     P_SW2   =   0xba;
  6. #define I2CCFG      (*(unsigned char volatile xdata *)0xfe80)
  7. #define I2CMSCR     (*(unsigned char volatile xdata *)0xfe81)
  8. #define I2CMSST     (*(unsigned char volatile xdata *)0xfe82)
  9. #define I2CSLCR     (*(unsigned char volatile xdata *)0xfe83)
  10. #define I2CSLST     (*(unsigned char volatile xdata *)0xfe84)
  11. #define I2CSLADR    (*(unsigned char volatile xdata *)0xfe85)
  12. #define I2CTXD      (*(unsigned char volatile xdata *)0xfe86)
  13. #define I2CRXD      (*(unsigned char volatile xdata *)0xfe87)
  14. sfr     P1M1    =   0x91;
  15. sfr     P1M0    =   0x92;
  16. sfr     P0M1    =   0x93;
  17. sfr     P0M0    =   0x94;
  18. sfr     P2M1    =   0x95;
  19. sfr     P2M0    =   0x96;
  20. sfr     P3M1    =   0xb1;
  21. sfr     P3M0    =   0xb2;
  22. sfr     P4M1    =   0xb3;
  23. sfr     P4M0    =   0xb4;
  24. sfr     P5M1    =   0xc9;
  25. sfr     P5M0    =   0xca;
  26. sbit    SDA     =   P3^3;
  27. sbit    SCL     =   P3^2;
  28. void Wait()
  29. {
  30.     while (!(I2CMSST & 0x40));
  31.     I2CMSST &= ~0x40;
  32. }
  33. void Start()
  34. {
  35.     I2CMSCR = 0x01;                             //发送START命令
  36.     Wait();
  37. }
  38. void SendData(char dat)
  39. {
  40.     I2CTXD = dat;                               //写数据到数据缓冲区
  41.     I2CMSCR = 0x02;                             //发送SEND命令
  42.     Wait();
  43. }
  44. void RecvACK()
  45. {
  46.     I2CMSCR = 0x03;                             //发送读ACK命令
  47.     Wait();
  48. }
  49. char RecvData()
  50. {
  51.     I2CMSCR = 0x04;                             //发送RECV命令
  52.     Wait();
  53.     return I2CRXD;
  54. }
  55. void SendACK()
  56. {
  57.     I2CMSST = 0x00;                             //设置ACK信号
  58.     I2CMSCR = 0x05;                             //发送ACK命令
  59.     Wait();
  60. }
  61. void SendNAK()
  62. {
  63.     I2CMSST = 0x01;                             //设置NAK信号
  64.     I2CMSCR = 0x05;                             //发送ACK命令
  65.     Wait();
  66. }
  67. void Stop()
  68. {
  69.     I2CMSCR = 0x06;                             //发送STOP命令
  70.     Wait();
  71. }
  72. void Delay()
  73. {
  74.     int i;
  75.     for (i=0; i<3000; i++)
  76.     {
  77.         _nop_();
  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81.     }
  82. }
  83. void main()
  84. {
  85.     P0M0 = 0x00;
  86.     P0M1 = 0x00;
  87.     P1M0 = 0x00;
  88.     P1M1 = 0x00;
  89.     P2M0 = 0x00;
  90.     P2M1 = 0x00;
  91.     P3M0 = 0x00;
  92.     P3M1 = 0x00;
  93.     P4M0 = 0x00;
  94.     P4M1 = 0x00;
  95.     P5M0 = 0x00;
  96.     P5M1 = 0x00;
  97.                                                 //( STC8G1K08-8Pin 系列、 STC8G1K08A 系列)
  98.     P_SW2 = 0x00;                               //SCL/P3.2, SDA/P3.3
  99. //  P_SW2 = 0x10;                               //SCL_2/P5.4, SDA_2/P5.5
  100. //因传统8051的SFR地址空间有限,新增的SFR位于xdata区域(XSFR),必须先打开EAXFR才能访问 XSFR和XDATA共用地址,
  101. //只有访问62.5K以上的XDATA时才需要关闭EAXFR 现有型号,只要不是扩展了片外64K SRAM(外接并口SRAM芯片),
  102. //初始化时果断先打开EAXFR,并且不需要再关闭,不要犹豫!
  103.     P_SW2 |= 0x80;                //外设端口切换寄存器 2     EAXFR=1
  104. //可以在上电系统初始化时将 EAXFR 寄存器设置为 1(例如: P_SW2 |= 0x80;),后续一直保持为 1 不用再修改,即可正常访问 XFR 区域。
  105.     I2CCFG = 0xe0;                              //使能I2C主机模式
  106.     I2CMSST = 0x00;
  107.     Start();                                    //发送起始命令
  108.     SendData(0x5a);                             //发送设备地址(010_1101B)+写命令(0B)
  109.     RecvACK();
  110.     SendData(0x00);                             //发送存储地址
  111.     RecvACK();
  112.     SendData(0x12);                             //写测试数据1
  113.     RecvACK();
  114.     SendData(0x78);                             //写测试数据2
  115.     RecvACK();
  116.     Stop();                                     //发送停止命令
  117.     Start();                                    //发送起始命令
  118.     SendData(0x5a);                             //发送设备地址(010_1101B)+写命令(0B)
  119.     RecvACK();
  120.     SendData(0x00);                             //发送存储地址高字节
  121.     RecvACK();
  122.     Start();                                    //发送起始命令
  123.     SendData(0x5b);                             //发送设备地址(010_1101B)+读命令(1B)
  124.     RecvACK();
  125.     P0 = RecvData();                            //读取数据1
  126.     SendACK();
  127.     P2 = RecvData();                            //读取数据2
  128.     SendNAK();
  129.     Stop();                                     //发送停止命令
  130.     //P_SW2 = 0x00; //后续一直保持为 1 不用再修改
  131.     //若用户不使用外部扩展 RAM 或者外部扩展 RAM 的最大地址不超过 0FA00H(例如只外扩 32K RAM),
  132.     while (1);
  133. }
  134. //20.5.4 I2C 从机模式(中断方式)
  135. //测试工作频率为 11.0592MHz
  136. #include "reg51.h"
  137. #include "intrins.h"
  138. sfr     P_SW2   =   0xba;
  139. #define I2CCFG      (*(unsigned char volatile xdata *)0xfe80)
  140. #define I2CMSCR     (*(unsigned char volatile xdata *)0xfe81)
  141. #define I2CMSST     (*(unsigned char volatile xdata *)0xfe82)
  142. #define I2CSLCR     (*(unsigned char volatile xdata *)0xfe83)
  143. #define I2CSLST     (*(unsigned char volatile xdata *)0xfe84)
  144. #define I2CSLADR    (*(unsigned char volatile xdata *)0xfe85)
  145. #define I2CTXD      (*(unsigned char volatile xdata *)0xfe86)
  146. #define I2CRXD      (*(unsigned char volatile xdata *)0xfe87)
  147. sfr     P1M1    =   0x91;
  148. sfr     P1M0    =   0x92;
  149. sfr     P0M1    =   0x93;
  150. sfr     P0M0    =   0x94;
  151. sfr     P2M1    =   0x95;
  152. sfr     P2M0    =   0x96;
  153. sfr     P3M1    =   0xb1;
  154. sfr     P3M0    =   0xb2;
  155. sfr     P4M1    =   0xb3;
  156. sfr     P4M0    =   0xb4;
  157. sfr     P5M1    =   0xc9;
  158. sfr     P5M0    =   0xca;
  159. sbit    SDA     =   P3^3;
  160. sbit    SCL     =   P3^2;
  161. bit isda;                                       //设备地址标志
  162. bit isma;                                       //存储地址标志
  163. unsigned char addr;
  164. unsigned char pdata buffer[256];
  165. void I2C_Isr() interrupt 24
  166. {
  167.     _push_(P_SW2);
  168.     P_SW2 |= 0x80;
  169.     if (I2CSLST & 0x40)
  170.     {
  171.         I2CSLST &= ~0x40;                       //处理START事件
  172.     }
  173.     else if (I2CSLST & 0x20)
  174.     {
  175.         I2CSLST &= ~0x20;                       //处理RECV事件
  176.         if (isda)
  177.         {
  178.             isda = 0;                           //处理RECV事件(RECV DEVICE ADDR)
  179.         }
  180.         else if (isma)
  181.         {
  182.             isma = 0;                           //处理RECV事件(RECV MEMORY ADDR)
  183.             addr = I2CRXD;
  184.             I2CTXD = buffer[addr];
  185.         }
  186.         else
  187.         {
  188.             buffer[addr++] = I2CRXD;            //处理RECV事件(RECV DATA)
  189.         }
  190.     }
  191.     else if (I2CSLST & 0x10)
  192.     {
  193.         I2CSLST &= ~0x10;                       //处理SEND事件
  194.         if (I2CSLST & 0x02)
  195.         {
  196.             I2CTXD = 0xff;                      //接收到NAK则停止读取数据
  197.         }
  198.         else
  199.         {
  200.             I2CTXD = buffer[++addr];            //接收到ACK则继续读取数据
  201.         }
  202.     }
  203.     else if (I2CSLST & 0x08)
  204.     {
  205.         I2CSLST &= ~0x08;                       //处理STOP事件
  206.         isda = 1;
  207.         isma = 1;
  208.     }
  209.     _pop_(P_SW2);
  210. }
  211. void main()
  212. {
  213.     P0M0 = 0x00;
  214.     P0M1 = 0x00;
  215.     P1M0 = 0x00;
  216.     P1M1 = 0x00;
  217.     P2M0 = 0x00;
  218.     P2M1 = 0x00;
  219.     P3M0 = 0x00;
  220.     P3M1 = 0x00;
  221.     P4M0 = 0x00;
  222.     P4M1 = 0x00;
  223.     P5M0 = 0x00;
  224.     P5M1 = 0x00;
  225.     P_SW2 = 0x80; //将 EAXFR 寄存器设置为 1 ,即可正常访问 XFR 区域。
  226.     I2CCFG = 0x81;                              //使能I2C从机模式
  227.     I2CSLADR = 0x5a;                            //设置从机设备地址寄存器I2CSLADR=0101_1010B
  228.                                                 //即I2CSLADR[7:1]=010_1101B,MA=0B。
  229.                                                 //由于MA为0,主机发送的的设备地址必须与
  230.                                                 //I2CSLADR[7:1]相同才能访问此I2C从机设备。
  231.                                                 //主机若需要写数据则要发送5AH(0101_1010B)
  232.                                                 //主机若需要读数据则要发送5BH(0101_1011B)
  233.     I2CSLST = 0x00;
  234.     I2CSLCR = 0x78;                             //使能从机模式中断
  235.     EA = 1;
  236.     isda = 1;                                   //用户变量初始化
  237.     isma = 1;
  238.     addr = 0;
  239.     I2CTXD = buffer[addr];
  240.     while (1);
  241. }
  242. //20.5.5 I2C 从机模式(查询方式)
  243. //测试工作频率为 11.0592MHz
  244. #include "reg51.h"
  245. #include "intrins.h"
  246. sfr     P_SW2   =   0xba;
  247. #define I2CCFG      (*(unsigned char volatile xdata *)0xfe80)
  248. #define I2CMSCR     (*(unsigned char volatile xdata *)0xfe81)
  249. #define I2CMSST     (*(unsigned char volatile xdata *)0xfe82)
  250. #define I2CSLCR     (*(unsigned char volatile xdata *)0xfe83)
  251. #define I2CSLST     (*(unsigned char volatile xdata *)0xfe84)
  252. #define I2CSLADR    (*(unsigned char volatile xdata *)0xfe85)
  253. #define I2CTXD      (*(unsigned char volatile xdata *)0xfe86)
  254. #define I2CRXD      (*(unsigned char volatile xdata *)0xfe87)
  255. sfr     P1M1    =   0x91;
  256. sfr     P1M0    =   0x92;
  257. sfr     P0M1    =   0x93;
  258. sfr     P0M0    =   0x94;
  259. sfr     P2M1    =   0x95;
  260. sfr     P2M0    =   0x96;
  261. sfr     P3M1    =   0xb1;
  262. sfr     P3M0    =   0xb2;
  263. sfr     P4M1    =   0xb3;
  264. sfr     P4M0    =   0xb4;
  265. sfr     P5M1    =   0xc9;
  266. sfr     P5M0    =   0xca;
  267. sbit    SDA     =   P3^3;
  268. sbit    SCL     =   P3^2;
  269. bit isda;                                       //设备地址标志
  270. bit isma;                                       //存储地址标志
  271. unsigned char addr;
  272. unsigned char pdata buffer[256];
  273. void main()
  274. {
  275.     P0M0 = 0x00;
  276.     P0M1 = 0x00;
  277.     P1M0 = 0x00;
  278.     P1M1 = 0x00;
  279.     P2M0 = 0x00;
  280.     P2M1 = 0x00;
  281.     P3M0 = 0x00;
  282.     P3M1 = 0x00;
  283.     P4M0 = 0x00;
  284.     P4M1 = 0x00;
  285.     P5M0 = 0x00;
  286.     P5M1 = 0x00;
  287.     P_SW2 = 0x80;   //将 EAXFR 寄存器设置为 1 ,即可正常访问 XFR 区域。
  288.     I2CCFG = 0x81;                              //使能I2C从机模式
  289.     I2CSLADR = 0x5a;                            //设置从机设备地址寄存器I2CSLADR=0101_1010B
  290.                                                 //即I2CSLADR[7:1]=010_1101B,MA=0B。
  291.                                                 //由于MA为0,主机发送的的设备地址必须与
  292.                                                 //I2CSLADR[7:1]相同才能访问此I2C从机设备。
  293.                                                 //主机若需要写数据则要发送5AH(0101_1010B)
  294.                                                 //主机若需要读数据则要发送5BH(0101_1011B)
  295.     I2CSLST = 0x00;
  296.     I2CSLCR = 0x00;                             //禁止从机模式中断
  297.     isda = 1;                                   //用户变量初始化
  298.     isma = 1;
  299.     addr = 0;
  300.     I2CTXD = buffer[addr];
  301.     while (1)
  302.     {
  303.         if (I2CSLST & 0x40)
  304.         {
  305.             I2CSLST &= ~0x40;                   //处理START事件
  306.         }
  307.         else if (I2CSLST & 0x20)
  308.         {
  309.             I2CSLST &= ~0x20;                   //处理RECV事件
  310.             if (isda)
  311.             {
  312.                 isda = 0;                       //处理RECV事件(RECV DEVICE ADDR)
  313.             }
  314.             else if (isma)
  315.             {
  316.                 isma = 0;                       //处理RECV事件(RECV MEMORY ADDR)
  317.                 addr = I2CRXD;
  318.                 I2CTXD = buffer[addr];
  319.             }
  320.             else
  321.             {
  322.                 buffer[addr++] = I2CRXD;        //处理RECV事件(RECV DATA)
  323.             }
  324.         }
  325.         else if (I2CSLST & 0x10)
  326.         {
  327.             I2CSLST &= ~0x10;                   //处理SEND事件
  328.             if (I2CSLST & 0x02)
  329.             {
  330.                 I2CTXD = 0xff;                  //接收到NAK则停止读取数据
  331.             }
  332.             else
  333.             {
  334.                 I2CTXD = buffer[++addr];        //接收到ACK则继续读取数据
  335.             }
  336.         }
  337.         else if (I2CSLST & 0x08)
  338.         {
  339.             I2CSLST &= ~0x08;                   //处理STOP事件
  340.             isda = 1;
  341.             isma = 1;
  342.         }
  343.     }
  344. }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:724
  • 最近打卡:2026-03-18 07:56:47
已绑定手机

97

主题

7244

回帖

1万

积分

超级版主

积分
13791
发表于 2026-1-24 12:46:40 | 显示全部楼层
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-23 23:08 , Processed in 0.112422 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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