STC15模擬i2c從機

2019-03-24 17:11发布

我是學習STC15的新手,想要把STC15模擬成i2c從機和另一主機溝通,但是網路上都找不到從機的範例可以參考,請問有高手能提供C語言的實例給我參考嗎?謝謝 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
qwqwqw2088
1楼-- · 2019-03-25 03:01
從機的範例
STC15的手册应该有范例
ABCD1771
2楼-- · 2019-03-25 04:52
 精彩回答 2  元偷偷看……
ienglgge
3楼-- · 2019-03-25 06:38
给你个思路,参考一下。可以操作两个io,输出高低电平,产生简单时序。单纯发送。  认真分析i2c的时序。踏下心来,这一步很重要。 设计一个主设备控制流程图。结合一个参考程序,主设备程序不难找吧, 连接从设备,实现简单通信。设计从设备通信的流程图。用程序实现,进行调试。
数码小叶
4楼-- · 2019-03-25 12:01
单主单从:
  1. #include "reg51.h"

  2. //#define MASTER                  //define:master undefine:slave
  3. #define FOSC        11059200L
  4. #define BAUD        (256 - FOSC / 32 / 115200)

  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;
  7. typedef unsigned long DWORD;

  8. sfr  AUXR       =   0x8e;       //Auxiliary register

  9. sfr SPSTAT      =   0xcd;       //SPI status register
  10. #define SPIF        0x80        //SPSTAT.7
  11. #define WCOL        0x40        //SPSTAT.6
  12. sfr SPCTL       =   0xce;       //SPI control register
  13. #define SSIG        0x80        //SPCTL.7
  14. #define SPEN        0x40        //SPCTL.6
  15. #define DORD        0x20        //SPCTL.5
  16. #define MSTR        0x10        //SPCTL.4
  17. #define CPOL        0x08        //SPCTL.3
  18. #define CPHA        0x04        //SPCTL.2
  19. #define SPDHH       0x00        //CPU_CLK/4
  20. #define SPDH        0x01        //CPU_CLK/16
  21. #define SPDL        0x02        //CPU_CLK/64
  22. #define SPDLL       0x03        //CPU_CLK/128
  23. sfr SPDAT       =   0xcf;       //SPI data register
  24. sbit SPISS      =   P1^3;       //SPI slave select, connect to slave' SS(P1.4) pin

  25. void InitUart();
  26. void InitSPI();
  27. void SendUart(BYTE dat);        //send data to PC
  28. BYTE RecvUart();                //receive data from PC
  29. BYTE SPISwap(BYTE dat);         //swap SPI data between master and slave

  30. ///////////////////////////////////////////////////////////

  31. void main()
  32. {
  33.     InitUart();                 //initial UART
  34.     InitSPI();                  //initial SPI

  35.     while (1)
  36.     {
  37. #ifdef MASTER                   //for master (receive UART data from PC and send it to slave, in the meantime
  38.                                 //            receive SPI data from slave and send it to PC)
  39.         SendUart(SPISwap(RecvUart()));
  40. #else                           //for salve (receive SPI data from master and
  41.         ACC = SPISwap(ACC);     //           send previous SPI data to master)
  42. #endif
  43.     }
  44. }

  45. ///////////////////////////////////////////////////////////

  46. void InitUart()
  47. {
  48.     SCON = 0x5a;                //set UART mode as 8-bit variable baudrate
  49.     TMOD = 0x20;                //timer1 as 8-bit auto reload mode
  50.     AUXR = 0x40;                //timer1 work at 1T mode
  51.     TH1 = TL1 = BAUD;           //115200 bps
  52.     TR1 = 1;
  53. }

  54. ///////////////////////////////////////////////////////////

  55. void InitSPI()
  56. {
  57.     SPDAT = 0;                  //initial SPI data
  58.     SPSTAT = SPIF | WCOL;       //clear SPI status
  59. #ifdef MASTER
  60.     SPCTL = SPEN | MSTR;        //master mode
  61. #else
  62.     SPCTL = SPEN;               //slave mode
  63. #endif
  64. }

  65. ///////////////////////////////////////////////////////////

  66. void SendUart(BYTE dat)
  67. {
  68.     while (!TI);                //wait pre-data sent
  69.     TI = 0;                     //clear TI flag
  70.     SBUF = dat;                 //send current data
  71. }

  72. ///////////////////////////////////////////////////////////

  73. BYTE RecvUart()
  74. {
  75.     while (!RI);                //wait receive complete
  76.     RI = 0;                     //clear RI flag
  77.     return SBUF;                //return receive data
  78. }

  79. ///////////////////////////////////////////////////////////

  80. BYTE SPISwap(BYTE dat)
  81. {
  82. #ifdef MASTER
  83.     SPISS = 0;                  //pull low slave SS
  84. #endif
  85.     SPDAT = dat;                //trigger SPI send
  86.     while (!(SPSTAT & SPIF));   //wait send complete
  87.     SPSTAT = SPIF | WCOL;       //clear SPI status
  88. #ifdef MASTER
  89.     SPISS = 1;                  //push high slave SS
  90. #endif
  91.     return SPDAT;               //return received SPI data
  92. }
复制代码
xgliyouquan
5楼-- · 2019-03-25 13:49
 精彩回答 2  元偷偷看……

一周热门 更多>