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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2692|回復: 9
打印 上一主題 下一主題
收起左側

關于C51使用SPI協議進行雙機通行的問題

  [復制鏈接]
跳轉到指定樓層
樓主
目標:兩塊完全相同的C51單片機使用SPI協議進行通信。電腦A通過串口助手發送字符至單片機A的SBUF,然后單片機A通過SPI協議發送至單片機B的SBUF,并顯示在電腦B的串口助手上。問題:SPI協議無法實現。
代碼如下:
  1. # include <reg52.h>//頭文件
  2. # include <intrins.h>//頭文件

  3. # define uchar unsigned char
  4. # define uint unsigned int

  5. sbit SCK = P1^0;//位定義時鐘
  6. sbit CS = P1^1;//位定義片選(使能)
  7. sbit SDI = P1^2;//位定義Input
  8. sbit SDO = P1^3;//位定義Output
  9. sbit WE = P2^7;//數碼管位選位定義
  10. sbit DU = P2^6;//數碼管段選位定義

  11. uchar num;//數碼管顯示的值
  12. uchar dat, dat0, dat1, b, flag;

  13. /*-----函數聲明-----*/
  14. void delay5us(void);
  15. void SpiInit();
  16. void SpiSend(uchar dat1);
  17. uchar SpiReceive();
  18. void UARTInit();
  19. void judge();
  20. void receive1();

  21. /*-----主函數-----*/
  22. void main()
  23. {
  24.         timer0Init();
  25.         UARTInit();
  26.         while (1)
  27.         {
  28.                 judge();//執行判斷
  29.         }        
  30. }

  31. /*-----5微秒延時函數-----*/
  32. void delay5us(void)
  33. {
  34.         _nop_();        
  35. }

  36. /*-----SPI初始化函數-----*/
  37. void SpiInit()
  38. {
  39.         SCK = 0;
  40.         delay5us();
  41. }

  42. /*-----SPI發送函數-----*/
  43. /*-----下降沿發送-----*/
  44. void SpiSend(uchar dat1)
  45. {
  46.         uchar i;
  47.         SCK = 0;//時序置低
  48.         delay5us();
  49.         for (i=8; i>0; i--)//8bit,一位一位寫
  50.         {
  51.                 if (dat1 & 0x80)//判斷當前最高位為1還是0
  52.                 {
  53.                         SDO = 1;               
  54.                 }
  55.                 else
  56.                 {
  57.                         SDO = 0;
  58.                 }
  59.                 SCK = 1;
  60.                 delay5us();
  61.                 SCK = 0;//產生時序下降沿,發送數據
  62.                 delay5us();
  63.                 dat1 <<= 1;
  64.         }
  65. }

  66. /*-----SPI接收函數-----*/
  67. /*-----上升沿接收-----*/
  68. uchar SpiReceive()
  69. {
  70.         uchar i;
  71.         dat = 0x00;
  72.         SCK = 0;//時序置低
  73.         delay5us();
  74.         for (i=8; i>0; i--)//8bit,一位一位寫
  75.         {
  76.                 SCK = 0;
  77.                 delay5us();
  78.                 SCK = 1;//產生時序上升沿,接收數據
  79.                 delay5us();
  80.                 dat0 <<= 1;
  81.                 dat0 |= (uchar)(SDI);
  82.                 delay5us();
  83.         }

  84.         return dat0;//收到數據(返回值)dat0
  85. }

  86. /*-----串口(中斷)初始化-----*/
  87. void UARTInit()
  88. {
  89.         EA = 1;//開啟總中斷
  90.         ES = 1;//打開串口中斷
  91.         SM0 = 0;SM1 = 1;//串口工作方式1,8位UART波特率可變
  92.         REN = 1;//串口允許接收
  93.         TR1 = 1;//啟動定時器1
  94.         TMOD |= 0X20;//定時器1,工作模式2 8位自動重裝
  95.         TH1 =0XFD;
  96.         TL1 =0XFD;//設置波特率9600
  97. }

  98. /*-----串口中斷服務函數-----*/
  99. void UART() interrupt 4
  100. {
  101.         if (RI)//判斷是否接收完成
  102.         {
  103.                 dat = SBUF;//讀SUBF
  104.                 flag = 1;//表明誰是主機
  105.                 RI = 0;//軟件清零
  106.         }
  107.         if (TI)//判斷是否發送完成
  108.         {
  109.                 TI = 0;//軟件清零

  110.         }
  111.         else
  112.         {
  113.                 flag = 2;//?
  114.         }               
  115. }

  116. void receive1()        //乙機發送數據給上位機
  117. {
  118.         
  119.         b=SBUF;
  120.         ES=0;
  121.         SBUF=b;
  122.         while(!TI);
  123.         TI=0;
  124.         ES=1;
  125. }

  126. void judge()
  127. {
  128.         SpiInit();
  129.         if(flag == 1)                //如果flag=1,那么就意味著是甲方單片機,獲得的是一手數據
  130.         {                //執行的是發送數據給上位機--電腦以及發送數據給乙方單片機
  131.                 SpiSend(dat);
  132.                 flag = 0;        
  133.         }
  134.         if (flag == 2)                        //如果flag=2那么就意味著是乙方單片機,獲得的是二手數據
  135.         {
  136.                 SpiReceive();
  137.                 receive1();     //執行的是接受數據,并且發送數據給上位機
  138.                 flag = 0;
  139.         }
  140. }
復制代碼
使用的SPI協議為:CPOA=0;CPHA=0
如圖




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:158375 發表于 2019-3-6 08:20 | 只看該作者
肯定是你的程序有不合適的地方,分部分來調試吧。
有點不明白:單片機A通過SPI協議,發送至單片機B的SBUF,這個是怎么回事。
回復

使用道具 舉報

板凳
ID:94031 發表于 2019-3-6 09:05 | 只看該作者
你這實驗環節很多,任何一個環節出錯就會實驗失敗,所以得一各一個環節搞,先看電腦A通過串口助手發送字符至單片機A的SBUF正常嗎,再看單片機A通過SPI協議發送至單片機B的SBUF正常嗎,最后才是顯示在電腦B的串口助手上正常嗎,不是光看程序能解決的。
回復

使用道具 舉報

地板
ID:94031 發表于 2019-3-6 09:20 | 只看該作者
笨笨兔 發表于 2019-3-6 08:20
肯定是你的程序有不合適的地方,分部分來調試吧。
有點不明白:單片機A通過SPI協議,發送至單片機B的SBUF ...

他的意思,單片機A通過SPI協議,發送至單片機B的SPI接收,然后轉到本單片機B串口SBUF,向電腦B的串口助手發送。估計是學習SPI的實驗項目。
回復

使用道具 舉報

5#
ID:476313 發表于 2019-3-6 10:47 | 只看該作者
xuyaqi 發表于 2019-3-6 09:05
你這實驗環節很多,任何一個環節出錯就會實驗失敗,所以得一各一個環節搞,先看電腦A通過串口助手發送字符 ...

電腦A通過串口助手發送字符至單片機A的SBUF正常
單片機A通過SPI協議發送至單片機B的SBUF失敗
問題應該處在SPI的配置上面,但是網上也沒有合適的解決方案
回復

使用道具 舉報

6#
ID:476313 發表于 2019-3-6 10:49 | 只看該作者
xuyaqi 發表于 2019-3-6 09:20
他的意思,單片機A通過SPI協議,發送至單片機B的SPI接收,然后轉到本單片機B串口SBUF,向電腦B的串口助手 ...

恩恩,是這樣的。
確實是學習SPI的項目
回復

使用道具 舉報

7#
ID:476313 發表于 2019-3-6 10:53 | 只看該作者
問題出在SPI上,問問大家根據下面的時序圖,SPI配置代碼有問題嗎?
回復

使用道具 舉報

8#
ID:94031 發表于 2019-3-6 13:25 | 只看該作者
Benjia 發表于 2019-3-6 10:49
恩恩,是這樣的。
確實是學習SPI的項目

用邏輯分析儀抓一下SPI時序看一下。
回復

使用道具 舉報

9#
ID:466164 發表于 2019-3-6 23:43 | 只看該作者
這個比較復雜:
1.從硬件講傳輸距離是不是太遠,
2.你B單片機接收程序是否正常,
3.B單片機是否能給電腦B發送,
4.你就一個程序,無法判斷,應該兩個系統程序,單片機A程序,單片機B程序。
回復

使用道具 舉報

10#
ID:485724 發表于 2019-3-7 01:10 | 只看該作者
應該是主從機的協議沒有設置好
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩欧美 | 91最新在线视频 | 亚洲国产激情 | av天空| 日韩精品视频中文字幕 | 亚洲三区在线观看 | 免费看色| 国产精品成人在线 | 青春草国产 | 一区二区三区av | 亚洲自拍偷拍免费视频 | 中文字幕av在线 | av片在线观看网站 | 九九在线视频 | 午夜视频网站 | 中文字幕精品一区 | 羞羞视频在线观看 | 久久9精品 | 国产精品成人在线 | 亚洲欧美中文日韩在线v日本 | 日韩在线精品视频 | 男女午夜激情视频 | 激情欧美日韩一区二区 | 99久久婷婷 | 国产在线观 | 欧美日韩亚洲一区 | 午夜精品一区二区三区在线视频 | 国产成人精品久久二区二区91 | 韩日在线视频 | 天堂在线www | 欧美婷婷 | 久久69精品久久久久久久电影好 | 羞羞视频免费观看入口 | 永久免费视频 | 一区二区精品 | 亚洲国产视频一区二区 | 成人精品一区二区三区 | 亚州精品成人 | 日韩在线一区二区三区 | 亚洲欧美国产精品久久 | 超碰在线播 |