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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用兩個C51單片機模擬SPI全雙工通信,請教各位大神,指導,這錯在哪里

[復制鏈接]
跳轉到指定樓層
樓主
ID:166571 發表于 2021-7-19 21:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用兩個C51單片機模擬SPI全雙工通信,
//SPI主機代碼
void SPI_PRO_INIT()
{
      SET_SFR_PAGE1;
          
     _SPI_NSS_OUTPUT;
         _SPI_NSS_PULLUPON;//上拉,關片選,
         
         _SPI_SCK_OUTPUT;
         _SPI_SCK_PULLDOWNON;//下拉        ,關時鐘

         _SPI_MOSI_OUTPUT;
         _SPI_MOSI_PULLDOWNON;//下拉        ,關數據輸出
         
         _SPI_MISO_INPUT;
         _SPI_MISO_PULLDOWNON;//下拉開啟,拉低輸入
         
         R_data=0;
         W_data=0;

         SET_SFR_PAGE0;


}
uint8 SPI_Read_Byte()
        {
                uint8 i;
                uint8 SPI1_dat=0;
       
                _SPI_NSS_ON;//片選
               
          for(i=0;i<8;i++)
                {
                _SPI_SCK_OFF;
                Delay_3us();
                SPI1_dat<<=1;//SPI1_dat=(SPI1_dat<<1),第一個上升沿讀取數據

                if(_SPI_MISO )//從機發來的信號,如果是高電平
                        {
                        SPI1_dat|=0x01;//0000 0001,左移后,補1;與(SPI_dat&0x80)//1000 0000相互呼應
                        }
                // else
                         //{
                         //SPI1_dat&=0xfe;//1111 1110,左移后,補0;
                         //}
        _SPI_SCK_ON;
                 Delay_3us();
                }
          
         // _SPI_SCK_OFF;
          _SPI_NSS_OFF; //關片選

          return SPI1_dat;
        }

uint8 SPI_Write_Byte(uint8 SPI_dat)
{
        uint8 i;

        _SPI_NSS_ON;//片選
  for(i=0;i<8;i++)
          {
          _SPI_SCK_OFF;
         Delay_3us();
        if(SPI_dat&0x80)//1000 0000,要發送的數據的第8位是1
                {
                _SPI_MOSI_ON;
                }
        else
                {
               
                _SPI_MOSI_OFF;
               
                }
        SPI_dat=(SPI_dat<<1);//左移,移動數據傳送
        _SPI_SCK_ON;
        Delay_3us();
          }
// _SPI_SCK_OFF;
  _SPI_NSS_OFF; //關片選

}



   void SPI_PRO()
   {
        W_data = SPI_Write_Byte(0x55 );//
        R_data = SPI_Read_Byte();
          if(R_data==0xAA)
           {
           _LED1_OFF;
           }
       
  }

//從機代碼
        void SPI_PRO_INIT()
         {
                   SET_SFR_PAGE1;
                  
                  _SPI_NSS_INPUT;
                  _SPI_NSS_PULLUPON;
                  
                  _SPI_SCK_INPUT;
                  _SPI_SCK_PULLDOWNON;
                  
                  _SPI_MOSI_INPUT;
                  _SPI_MOSI_PULLDOWNON;
                  
                  _SPI_MISO_OUTPUT;
                  _SPI_MISO_PULLDOWNON;
         
                  SET_SFR_PAGE0;
                 
                 W_data=0;
                 R_data=0;
       
                  
         }

                /******************************************************************************
                * Function         :        Slave_SPI_Read_Byte
                * Description:        從SPI讀出一個8位字節
                * Input          :        SPI1_dat:要發送的數據
               
                *******************************************************************************/
        uint8 SPI_Read_Byte()
                {
                  uint8 i;
                  uint8 SPI1_dat=0;
                  uint8 SPI1_flag=0;
                               
                 if(!(_SPI_NSS ))//片選后,執行if(!(_SPI_NSS ))里面的函數
                        {
                         for(i=0;i<8;i++)
                                {
                                SPI1_flag=1;
                                while(!( _SPI_SCK ));//等待時鐘拉低,開始讀數據
                                SPI1_dat<<=1;//SPI1_dat=(SPI1_dat<<1)開始
                                if(_SPI_MOSI )
                                        {
                                        SPI1_dat|=0x01;//讀取后,第一位補1;//與SPI_dat&0x80相呼應
                                       
                                        }
                                while(_SPI_SCK );//等待讀取結束
                               
                                }
                         while(!(_SPI_NSS ));//等待關片選
                        }
                  if(SPI1_flag==1)
                        {
                        return SPI1_dat;
                        }
                  else
                        {
                        return 0;
                        }
                }
       
       
        /******************************************************************************
        * Function         :        Slave_SPI_Write
        * Description:        向SPI寫入一個8位字節
        * Input          :        SPI_dat:要發送的數據
       
        *******************************************************************************/
        uint8 SPI_Write_Byte(uint8 SPI_dat)
        {
                uint8 i;
        if(!(_SPI_NSS ))//片選后,執行if(!(_SPI_NSS ))里面的函數
                {
                  for(i=0;i<8;i++)
                          {
                          while(_SPI_SCK);//_SPI_SCK低時,執行后面的函數
                        if(SPI_dat&0x80)//1000 0000 是高電平,有數據
                                {
                                _SPI_MISO_ON;
                                }
                        else
                                {
                                _SPI_MISO_OFF;
                                }
                        while(!(_SPI_SCK));//等待讀取完成
                           SPI_dat<<=1;//向SPI寫數據
                       
                          }
                 while(!(_SPI_NSS ));//等待關片選
                }
       
        }
       



  void SPI_PRO()
  {

         W_data= SPI_Write_Byte(0xAA );//
         R_data= SPI_Read_Byte();
         if(R_data==0x55)
          {
          _LED2_OFF;
          }

  }


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

使用道具 舉報

沙發
ID:166571 發表于 2021-7-19 21:59 | 只看該作者
菜鳥求大神指教,
回復

使用道具 舉報

板凳
ID:123289 發表于 2021-7-20 09:25 | 只看該作者
先說說錯誤的現象長什么樣子?
回復

使用道具 舉報

地板
ID:592807 發表于 2021-7-20 09:37 | 只看該作者
看著太麻煩了,理解也費勁。還是解釋一下吧


1  所謂的雙全工值得是通訊雙向,接收數據的同時必須發等量數據,就像我給你一桶水你給我一桶水,如果我沒收到一桶水就表示我給你的一桶水中途灑了,我要重新給你一份水,直到我收到你的水,這樣我才能確保你一定收到水。但是你的發送沒同步接收,不能確保從機一定受到數據。
2主機已經結束從機還沒開始。
         W_data= SPI_Write_Byte(0xAA );//
         R_data= SPI_Read_Byte();

你的通訊應該是這樣的

主機片選  ----  主機發送“0XAA”-----主機片選關閉 ----主機片選 -----主機開始接受---主機接受完畢---主機關閉片選
從機被片選----從機接受數據“0XAA”----從機處理數據----從機被片選-------從機發送數據
你這個主機接受數據和從機發送數據的時間沒法保證統一,就像接力賽,時間一到就開始跑,不管接力棒是否已經到你手里了,也不管你接到是不是自家隊友的接力棒。


回復

使用道具 舉報

5#
ID:166571 發表于 2021-7-20 14:46 | 只看該作者
黃youhui 發表于 2021-7-20 09:37
看著太麻煩了,理解也費勁。還是解釋一下吧

那怎樣保證啊,我也是參考別家的,
回復

使用道具 舉報

6#
ID:166571 發表于 2021-7-20 14:48 | 只看該作者
yzwzfyz 發表于 2021-7-20 09:25
先說說錯誤的現象長什么樣子?

從機與主機不能通信
回復

使用道具 舉報

7#
ID:592807 發表于 2021-7-20 15:25 | 只看該作者
qiuluqiang 發表于 2021-7-20 14:46
那怎樣保證啊,我也是參考別家的,

你主機發送完后就while(1)等。
從機要發送數據前片選CS=0
主機加收到CS=0信號,就開始接受
回復

使用道具 舉報

8#
ID:166571 發表于 2021-7-21 19:24 | 只看該作者
你要這方面的代碼嗎,能提供參考下嗎
回復

使用道具 舉報

9#
ID:166571 發表于 2021-7-21 19:39 | 只看該作者
接收與發送是時鐘控制的啊,
回復

使用道具 舉報

10#
ID:166571 發表于 2021-7-21 19:40 | 只看該作者
你有這方面的代碼嗎,就是用兩個單片機模擬SPI的互相通信的,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区视频在线播放 | 亚洲电影在线播放 | 亚洲精品av在线 | 久久国产精品一区 | 亚洲激情一区二区三区 | 久久四虎| 涩涩视频在线看 | 久草视| 夜夜骑首页| 少妇特黄a一区二区三区88av | 黄色大片免费看 | 一级毛片大全免费播放 | 日韩欧美精品一区 | 国产欧美日韩久久久 | 免费黄网站在线观看 | 天天草视频 | 亚洲成人免费视频在线观看 | 中文字幕一区二区不卡 | 国产精品一区二区久久 | 69亚洲精品| 国产激情一区二区三区 | 一区二区三区亚洲视频 | 国产欧美日韩一区 | 国产大学生情侣呻吟视频 | 黑人中文字幕一区二区三区 | 精品一区国产 | 毛片一区二区 | 成人av一区 | 日韩精品在线免费观看视频 | 中文字幕乱码视频32 | 一区二区免费在线观看 | 男女羞羞视频大全 | 亚洲一区二区三区视频在线 | 亚洲国产精品久久久久秋霞不卡 | 精品1区| 超碰欧美 | 黄色免费观看 | av手机免费在线观看 | 国产一区二区三区在线视频 | 99综合网| 狠狠操狠狠 |