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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1592|回復: 0
打印 上一主題 下一主題
收起左側(cè)

STM32 SPI主從機通信,附主從機代碼

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:393904 發(fā)表于 2018-9-5 10:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32 SPI主從機通信,附主從機代碼Master和Slave

  1. #include "sys.h" //系統(tǒng)子函數(shù)
  2. #include "usart.h"//串口子函數(shù)               
  3. #include "delay.h" //延時子函數(shù)
  4. // SPI總線速度設置
  5. #define SPI_SPEED_2   0
  6. #define SPI_SPEED_8   1
  7. #define SPI_SPEED_16  2
  8. #define SPI_SPEED_256 3

  9. u8 Slave_Temp=0;

  10. void SPI1_Init(void);                         //初始化SPI口
  11. void SPI1_SetSpeed(u8 SpeedSet); //設置SPI速度   
  12. u8 SPI1_ReadWriteByte(u8 TxData);

  13. int main(void)
  14. {
  15.         Stm32_Clock_Init(3); //系統(tǒng)時鐘設置
  16.         delay_init(24);//延時函數(shù)初始化
  17.         uart_init(24,9600); //串口初始化
  18.         SPI1_Init(); //SPI1初始化
  19.         SPI1_SetSpeed(SPI_SPEED_256);//SPI速度兩分頻
  20.         MY_NVIC_Init(0,0,SPI1_IRQChannel,4);          //設置搶占優(yōu)先級為1,響應優(yōu)先級為1,中斷分組為4
  21.         while(1)
  22.         {       
  23.                   printf("Slave_Temp=%x\r\n",Slave_Temp);
  24.                 delay_ms(100);       
  25.         }
  26. }

  27. //SPI口初始化
  28. //這里針是對SPI1的初始化
  29. void SPI1_Init(void)
  30. {         
  31.         RCC->APB2ENR|=1<<0; //復用
  32.         RCC->APB2ENR|=1<<2;       //PORTA時鐘使能          
  33.         RCC->APB2ENR|=1<<12;      //SPI1時鐘使能
  34.                   
  35.         //這里只針對SPI口初始化
  36.         GPIOA->CRL&=0X000FFFFF;
  37.         GPIOA->CRL|=0XBBB00000;//PA5.6.7復用             
  38.         GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉

  39.                
  40.         SPI1->CR1|=0<<10;//全雙工模式       
  41.         SPI1->CR1|=1<<9; //軟件nss管理
  42.         SPI1->CR1|=0<<8;//ssi為0  

  43.         SPI1->CR1|=0<<2; //SPI從機
  44.         SPI1->CR1|=0<<11;//8bit數(shù)據(jù)格式       
  45.         SPI1->CR1|=1<<1; //空閑模式下SCK為1 CPOL=1
  46.         SPI1->CR1|=1<<0; //數(shù)據(jù)采樣從第二個時間邊沿開始,CPHA=1  
  47.         SPI1->CR1|=0<<3; //Fsck=Fcpu/256
  48.         SPI1->CR1|=0<<7; //MSBfirst
  49.        
  50.         SPI1->CR2|=1<<6;      //接收緩沖區(qū)非空中斷使能
  51.         MY_NVIC_Init(1,0,SPI1_IRQChannel,4);   
  52.          
  53.         SPI1->CR1|=1<<6; //SPI設備使能
  54.          
  55. }   
  56. //SPI 速度設置函數(shù)
  57. //SpeedSet:
  58. //SPI_SPEED_2   2分頻   (SPI 12M    --sys 24M)
  59. //SPI_SPEED_8   8分頻   (SPI 3M     --sys 24M)
  60. //SPI_SPEED_16  16分頻  (SPI 1.5M    --sys 24M)
  61. //SPI_SPEED_256 256分頻 (SPI  905.6K --sys 24M)
  62. void SPI1_SetSpeed(u8 SpeedSet)
  63. {
  64.         SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
  65.         if(SpeedSet==SPI_SPEED_2)//二分頻
  66.         {
  67.                 SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz       
  68.         }
  69.         else if(SpeedSet==SPI_SPEED_8)//八分頻
  70.         {
  71.                 SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz       
  72.         }
  73.         else if(SpeedSet==SPI_SPEED_16)//十六分頻
  74.         {
  75.                 SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
  76.         }
  77.         else                                  //256分頻
  78.         {
  79.                 SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
  80.         }
  81.         SPI1->CR1|=1<<6; //SPI設備使能          
  82. }


  83. u8 SPI1_ReadWriteByte(u8 TxData)
  84. {               
  85.         u8 retry=0;                                 
  86.         while((SPI1->SR&1<<1)==0)//等待發(fā)送區(qū)空       
  87.         {
  88.                 retry++;
  89.                 if(retry>200)return 0;
  90.         }                          
  91.         SPI1->DR=TxData;                   //發(fā)送一個byte
  92.         retry=0;
  93.         while((SPI1->SR&1<<0)==0) //等待接收完一個byte  
  94.         {
  95.                 retry++;
  96.                 if(retry>200)return 0;
  97.         }                                                              
  98.         return SPI1->DR;          //返回收到的數(shù)據(jù)                                    
  99. }

  100. u8 SPI1_ReadByte(u8 TxData)
  101. {               
  102.         u8 retry=0;                                 
  103. //        while((SPI1->SR&1<<1)==0)//等待發(fā)送區(qū)空       
  104. //        {
  105. //                retry++;
  106. //                if(retry>200)return 0;
  107. //        }                          
  108. //        SPI1->DR=TxData;                   //發(fā)送一個byte
  109. //        retry=0;
  110.         while((SPI1->SR&1<<0)==0) //等待接收完一個byte  
  111.         {
  112.                 retry++;
  113.                 if(retry>200)return 0;
  114.         }                                                              
  115.         return SPI1->DR;          //返回收到的數(shù)據(jù)                                    
  116. }


  117. void SPI1_IRQHandler(void)
  118. {
  119.         if((SPI1->SR&1<<0)==1)
  120.         {                                       
  121.                 Slave_Temp = SPI1_ReadByte(0x00);       
  122.                 SPI1_ReadWriteByte(0xaa);       
  123.         }        
  124. }



復制代碼
  1. #include "sys.h" //系統(tǒng)子函數(shù)
  2. #include "usart.h"//串口子函數(shù)               
  3. #include "delay.h" //延時子函數(shù)
  4. // SPI總線速度設置
  5. #define SPI_SPEED_2   0
  6. #define SPI_SPEED_8   1
  7. #define SPI_SPEED_16  2
  8. #define SPI_SPEED_256 3

  9. u8 Master_Temp =0;
  10. void SPI1_Init(void);                         //初始化SPI口
  11. void SPI1_SetSpeed(u8 SpeedSet); //設置SPI速度   
  12. u8 SPI1_ReadWriteByte(u8 TxData);//SPI總線讀寫一個字節(jié)

  13. int main(void)
  14. {
  15.         Stm32_Clock_Init(3); //系統(tǒng)時鐘設置
  16.         delay_init(24);//延時函數(shù)初始化
  17.         uart_init(24,9600); //串口初始化
  18.         SPI1_Init(); //SPI1初始化
  19.         SPI1_SetSpeed(SPI_SPEED_256);//SPI速度兩分頻
  20.         while(1)
  21.         {       
  22.                 SPI1_ReadWriteByte(0x55);
  23.                 SPI1_ReadWriteByte(0x66);
  24.                 printf("Master_Temp =%x\r\n",Master_Temp);
  25.                 delay_ms(100);       
  26.         }
  27. }

  28. //SPI口初始化
  29. //這里針是對SPI1的初始化
  30. void SPI1_Init(void)
  31. {       
  32.         RCC->APB2ENR|=1<<0; //復用
  33.         RCC->APB2ENR|=1<<2;       //PORTA時鐘使能          
  34.         RCC->APB2ENR|=1<<12;      //SPI1時鐘使能
  35.                   
  36.         //這里只針對SPI口初始化
  37.         GPIOA->CRL&=0X000FFFFF;
  38.         GPIOA->CRL|=0XBBB00000;//PA5.6.7復用             
  39.         GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉

  40.                
  41.         SPI1->CR1|=0<<10;//全雙工模式       
  42.         SPI1->CR1|=1<<9; //軟件nss管理
  43.         SPI1->CR1|=1<<8;  

  44.         SPI1->CR1|=1<<2; //SPI主機
  45.         SPI1->CR1|=0<<11;//8bit數(shù)據(jù)格式       
  46.         SPI1->CR1|=1<<1; //空閑模式下SCK為1 CPOL=1
  47.         SPI1->CR1|=1<<0; //數(shù)據(jù)采樣從第二個時間邊沿開始,CPHA=1  
  48.         SPI1->CR1|=0<<3; //Fsck=Fcpu/256
  49.         SPI1->CR1|=0<<7; //MSBfirst
  50.        
  51.         SPI1->CR2|=1<<6;      //接收緩沖區(qū)非空中斷使能
  52.         MY_NVIC_Init(1,0,SPI1_IRQChannel,4);   
  53.           
  54.         SPI1->CR1|=1<<6; //SPI設備使能
  55.                  
  56. }   
  57. //SPI 速度設置函數(shù)
  58. //SpeedSet:
  59. //SPI_SPEED_2   2分頻   (SPI 12M    --sys 24M)
  60. //SPI_SPEED_8   8分頻   (SPI 3M     --sys 24M)
  61. //SPI_SPEED_16  16分頻  (SPI 1.5M    --sys 24M)
  62. //SPI_SPEED_256 256分頻 (SPI  905.6K --sys 24M)
  63. void SPI1_SetSpeed(u8 SpeedSet)
  64. {
  65.         SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
  66.         if(SpeedSet==SPI_SPEED_2)//二分頻
  67.         {
  68.                 SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz       
  69.         }else if(SpeedSet==SPI_SPEED_8)//八分頻
  70.         {
  71.                 SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz       
  72.         }else if(SpeedSet==SPI_SPEED_16)//十六分頻
  73.         {
  74.                 SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
  75.         }else                                  //256分頻
  76.         {
  77.                 SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
  78.         }
  79.         SPI1->CR1|=1<<6; //SPI設備使能          
  80. }
  81. //SPIx 讀寫一個字節(jié)
  82. //TxData:要寫入的字節(jié)
  83. //返回值:讀取到的字節(jié)
  84. u8 SPI1_ReadWriteByte(u8 TxData)
  85. {               
  86.         u8 retry=0;                                 
  87.         while((SPI1->SR&1<<1)==0)//等待發(fā)送區(qū)空       
  88.         {
  89.                 retry++;
  90.                 if(retry>200)return 0;
  91.         }                          
  92.         SPI1->DR=TxData;                   //發(fā)送一個byte
  93.         retry=0;
  94.         while((SPI1->SR&1<<0)==0) //等待接收完一個byte  
  95.         {
  96.                 retry++;
  97.                 if(retry>200)return 0;
  98.         }                                                              
  99.         return SPI1->DR;          //返回收到的數(shù)據(jù)                                    
  100. }

  101. u8 SPI1_ReadByte(u8 TxData)
  102. {               
  103.         u8 retry=0;                                 

  104.         while((SPI1->SR&1<<0)==0) //等待接收完一個byte  
  105.         {
  106.                 retry++;
  107.                 if(retry>200)return 0;
  108.         }                                                              
  109.         return SPI1->DR;          //返回收到的數(shù)據(jù)                                    
  110. }


  111. void SPI1_IRQHandler(void)
  112. {       
  113.         if((SPI1->SR&1<<0)==1)
  114.         {         
  115.                 Master_Temp = SPI1_ReadByte(0x00);
  116.         }        
  117. }
復制代碼


STM32_SPI雙機通信.rar

119.95 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5

STM32_SPI主從機通信

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人在线网站 | 四虎首页| 欧美日韩在线一区二区 | 欧美电影网 | 国内精品一区二区 | 欧美不卡一区二区 | 久久精品视频99 | 国产精品激情小视频 | 91精品国产91久久久 | 日本成人午夜影院 | 97久久精品 | 亚洲精品女优 | 精品欧美乱码久久久久久1区2区 | 伊人春色成人网 | 99精品网 | 国产黄视频在线播放 | 色婷婷久久久久swag精品 | 亚洲精品久久久久中文字幕欢迎你 | 欧美性网 | 日日操日日干 | 国产精品高清在线 | 天天综合91 | 日韩一区二区三区视频在线播放 | 久久国产99 | 日日碰狠狠躁久久躁婷婷 | 国产a视频 | 欧美精品一二三 | 亚洲免费精品 | 男女视频在线观看网站 | 另类二区| 天天干免费视频 | 美女爽到呻吟久久久久 | 国产小网站 | 九一在线观看 | 91网站视频在线观看 | 天天草天天干天天 | 操皮视频 | 国产精品精品久久久 | 日韩1区 | 日韩欧美在线免费观看视频 | 日韩一区二区三区在线观看 |