找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2659|回復(fù): 9
收起左側(cè)

關(guān)于C51使用SPI協(xié)議進行雙機通行的問題

  [復(fù)制鏈接]
ID:476313 發(fā)表于 2019-3-5 22:39 | 顯示全部樓層 |閱讀模式
目標:兩塊完全相同的C51單片機使用SPI協(xié)議進行通信。電腦A通過串口助手發(fā)送字符至單片機A的SBUF,然后單片機A通過SPI協(xié)議發(fā)送至單片機B的SBUF,并顯示在電腦B的串口助手上。問題:SPI協(xié)議無法實現(xiàn)。
代碼如下:
  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;//數(shù)碼管位選位定義
  10. sbit DU = P2^6;//數(shù)碼管段選位定義

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

  13. /*-----函數(shù)聲明-----*/
  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. /*-----主函數(shù)-----*/
  22. void main()
  23. {
  24.         timer0Init();
  25.         UARTInit();
  26.         while (1)
  27.         {
  28.                 judge();//執(zhí)行判斷
  29.         }        
  30. }

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

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

  42. /*-----SPI發(fā)送函數(shù)-----*/
  43. /*-----下降沿發(fā)送-----*/
  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)//判斷當(dāng)前最高位為1還是0
  52.                 {
  53.                         SDO = 1;               
  54.                 }
  55.                 else
  56.                 {
  57.                         SDO = 0;
  58.                 }
  59.                 SCK = 1;
  60.                 delay5us();
  61.                 SCK = 0;//產(chǎn)生時序下降沿,發(fā)送數(shù)據(jù)
  62.                 delay5us();
  63.                 dat1 <<= 1;
  64.         }
  65. }

  66. /*-----SPI接收函數(shù)-----*/
  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;//產(chǎn)生時序上升沿,接收數(shù)據(jù)
  79.                 delay5us();
  80.                 dat0 <<= 1;
  81.                 dat0 |= (uchar)(SDI);
  82.                 delay5us();
  83.         }

  84.         return dat0;//收到數(shù)據(jù)(返回值)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;//設(shè)置波特率9600
  97. }

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

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

  116. void receive1()        //乙機發(fā)送數(shù)據(jù)給上位機
  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,那么就意味著是甲方單片機,獲得的是一手數(shù)據(jù)
  130.         {                //執(zhí)行的是發(fā)送數(shù)據(jù)給上位機--電腦以及發(fā)送數(shù)據(jù)給乙方單片機
  131.                 SpiSend(dat);
  132.                 flag = 0;        
  133.         }
  134.         if (flag == 2)                        //如果flag=2那么就意味著是乙方單片機,獲得的是二手數(shù)據(jù)
  135.         {
  136.                 SpiReceive();
  137.                 receive1();     //執(zhí)行的是接受數(shù)據(jù),并且發(fā)送數(shù)據(jù)給上位機
  138.                 flag = 0;
  139.         }
  140. }
復(fù)制代碼
使用的SPI協(xié)議為:CPOA=0;CPHA=0
如圖

BENJIA_2019-03-05_22-37-26.jpg


回復(fù)

使用道具 舉報

ID:158375 發(fā)表于 2019-3-6 08:20 | 顯示全部樓層
肯定是你的程序有不合適的地方,分部分來調(diào)試吧。
有點不明白:單片機A通過SPI協(xié)議,發(fā)送至單片機B的SBUF,這個是怎么回事。
回復(fù)

使用道具 舉報

ID:94031 發(fā)表于 2019-3-6 09:05 | 顯示全部樓層
你這實驗環(huán)節(jié)很多,任何一個環(huán)節(jié)出錯就會實驗失敗,所以得一各一個環(huán)節(jié)搞,先看電腦A通過串口助手發(fā)送字符至單片機A的SBUF正常嗎,再看單片機A通過SPI協(xié)議發(fā)送至單片機B的SBUF正常嗎,最后才是顯示在電腦B的串口助手上正常嗎,不是光看程序能解決的。
回復(fù)

使用道具 舉報

ID:94031 發(fā)表于 2019-3-6 09:20 | 顯示全部樓層
笨笨兔 發(fā)表于 2019-3-6 08:20
肯定是你的程序有不合適的地方,分部分來調(diào)試吧。
有點不明白:單片機A通過SPI協(xié)議,發(fā)送至單片機B的SBUF ...

他的意思,單片機A通過SPI協(xié)議,發(fā)送至單片機B的SPI接收,然后轉(zhuǎn)到本單片機B串口SBUF,向電腦B的串口助手發(fā)送。估計是學(xué)習(xí)SPI的實驗項目。
回復(fù)

使用道具 舉報

ID:476313 發(fā)表于 2019-3-6 10:47 | 顯示全部樓層
xuyaqi 發(fā)表于 2019-3-6 09:05
你這實驗環(huán)節(jié)很多,任何一個環(huán)節(jié)出錯就會實驗失敗,所以得一各一個環(huán)節(jié)搞,先看電腦A通過串口助手發(fā)送字符 ...

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

使用道具 舉報

ID:476313 發(fā)表于 2019-3-6 10:49 | 顯示全部樓層
xuyaqi 發(fā)表于 2019-3-6 09:20
他的意思,單片機A通過SPI協(xié)議,發(fā)送至單片機B的SPI接收,然后轉(zhuǎn)到本單片機B串口SBUF,向電腦B的串口助手 ...

恩恩,是這樣的。
確實是學(xué)習(xí)SPI的項目
回復(fù)

使用道具 舉報

ID:476313 發(fā)表于 2019-3-6 10:53 | 顯示全部樓層
問題出在SPI上,問問大家根據(jù)下面的時序圖,SPI配置代碼有問題嗎?
回復(fù)

使用道具 舉報

ID:94031 發(fā)表于 2019-3-6 13:25 | 顯示全部樓層
Benjia 發(fā)表于 2019-3-6 10:49
恩恩,是這樣的。
確實是學(xué)習(xí)SPI的項目

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

使用道具 舉報

ID:466164 發(fā)表于 2019-3-6 23:43 | 顯示全部樓層
這個比較復(fù)雜:
1.從硬件講傳輸距離是不是太遠,
2.你B單片機接收程序是否正常,
3.B單片機是否能給電腦B發(fā)送,
4.你就一個程序,無法判斷,應(yīng)該兩個系統(tǒng)程序,單片機A程序,單片機B程序。
回復(fù)

使用道具 舉報

ID:485724 發(fā)表于 2019-3-7 01:10 | 顯示全部樓層
應(yīng)該是主從機的協(xié)議沒有設(shè)置好
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表