找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

STM32的SPI主從通信程序?qū)嵙?/span>

[復(fù)制鏈接]
ID:195585 發(fā)表于 2017-5-2 15:26 | 顯示全部樓層 |閱讀模式
這是自己用STM32做的SPI通信模塊,包括主機(jī)程序和從機(jī)程序。
0.png 0.png
展示一部分程序:

  1. #include "sys.h" //系統(tǒng)子函數(shù)
  2. #include "usart.h"//串口子函數(shù)               
  3. #include "delay.h" //延時(shí)子函數(shù)

  4. //PA4 SPI1_NSS
  5. //PA5 SPI1_SCK
  6. //PA6 SPI1_MISO
  7. //PA7 SPI1_MOSI



  8. // SPI總線速度設(shè)置
  9. #define SPI_SPEED_2   0
  10. #define SPI_SPEED_8   1
  11. #define SPI_SPEED_16  2
  12. #define SPI_SPEED_256 3

  13. u8 Master_Temp =0;
  14. void SPI1_Init(void);                         //初始化SPI口
  15. void SPI1_SetSpeed(u8 SpeedSet); //設(shè)置SPI速度   
  16. u8 SPI1_ReadWriteByte(u8 TxData);//SPI總線讀寫一個(gè)字節(jié)

  17. int main(void)
  18. {
  19.                 SystemInit();
  20.                 delay_init(72);             //延時(shí)初始化
  21.                 NVIC_Configuration();       
  22.                 uart_init(9600);//串口初始化為9600
  23.                 SPI1_Init(); //SPI1初始化
  24.                 SPI1_SetSpeed(SPI_SPEED_256);
  25.                 while(1)
  26.                 {       
  27. //                        SPI1_ReadWriteByte(0x55);
  28.                         SPI1_ReadWriteByte(0x78);
  29.                         printf("Master_Temp =%x\r\n",Master_Temp);
  30.                         delay_ms(100);       
  31.                 }
  32. }

  33. //SPI口初始化
  34. //這里針是對(duì)SPI1的初始化
  35. void SPI1_Init(void)
  36. {       
  37.         NVIC_InitTypeDef NVIC_InitStructure;
  38.         RCC->APB2ENR|=1<<0; //復(fù)用
  39.         RCC->APB2ENR|=1<<2;       //PORTA時(shí)鐘使能          
  40.         RCC->APB2ENR|=1<<12;      //SPI1時(shí)鐘使能   
  41.         //這里只針對(duì)SPI口初始化
  42.         GPIOA->CRL&=0X000FFFFF;
  43.         GPIOA->CRL|=0XBBB00000;//PA5.6.7復(fù)用             
  44.         GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉
  45.         SPI1->CR1|=0<<10;//全雙工模式       
  46.         SPI1->CR1|=1<<9; //軟件nss管理
  47.         SPI1->CR1|=1<<8;  
  48.         SPI1->CR1|=1<<2; //SPI主機(jī)
  49.         SPI1->CR1|=0<<11;//8bit數(shù)據(jù)格式       
  50.         SPI1->CR1|=1<<1; //空閑模式下SCK為1 CPOL=1
  51.         SPI1->CR1|=1<<0; //數(shù)據(jù)采樣從第二個(gè)時(shí)間邊沿開始,CPHA=1  
  52.         SPI1->CR1|=0<<3; //Fsck=Fcpu/256
  53.         SPI1->CR1|=0<<7; //MSBfirst
  54.         SPI1->CR2|=1<<6;      //接收緩沖區(qū)非空中斷使能

  55.         NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
  56.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  57.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  58.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  59.         NVIC_Init(&NVIC_InitStructure);
  60.         SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE);
  61.         SPI_Cmd(SPI1, ENABLE); //使能SPI外設(shè)
  62.         SPI1_ReadWriteByte(0xff);//啟動(dòng)傳輸                                  
  63. }   
  64. //SPI 速度設(shè)置函數(shù)
  65. //SpeedSet:
  66. //SPI_SPEED_2   2分頻   (SPI 12M    --sys 24M)
  67. //SPI_SPEED_8   8分頻   (SPI 3M     --sys 24M)
  68. //SPI_SPEED_16  16分頻  (SPI 1.5M    --sys 24M)
  69. //SPI_SPEED_256 256分頻 (SPI  905.6K --sys 24M)
  70. void SPI1_SetSpeed(u8 SpeedSet)
  71. {
  72.         SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
  73.         if(SpeedSet==SPI_SPEED_2)//二分頻
  74.         {
  75.                 SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz       
  76.         }else if(SpeedSet==SPI_SPEED_8)//八分頻
  77.         {
  78.                 SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz       
  79.         }else if(SpeedSet==SPI_SPEED_16)//十六分頻
  80.         {
  81.                 SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
  82.         }else                                  //256分頻
  83.         {
  84.                 SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
  85.         }
  86.         SPI1->CR1|=1<<6; //SPI設(shè)備使能          
  87. }
  88. //SPIx 讀寫一個(gè)字節(jié)
  89. //TxData:要寫入的字節(jié)
  90. //返回值:讀取到的字節(jié)
  91. u8 SPI1_ReadWriteByte(u8 TxData)
  92. {               
  93.         u8 retry=0;                                 
  94.         while((SPI1->SR&1<<1)==0)//等待發(fā)送區(qū)空       
  95.         {
  96.                 retry++;
  97.                 if(retry>200)return 0;
  98.         }                          
  99.         SPI1->DR=TxData;                   //發(fā)送一個(gè)byte
  100.         retry=0;
  101.         while((SPI1->SR&1<<0)==0) //等待接收完一個(gè)byte  
  102.         {
  103.                 retry++;
  104.                 if(retry>200)return 0;
  105.         }                                                              
  106.         return SPI1->DR;          //返回收到的數(shù)據(jù)                                    
  107. }

  108. u8 SPI1_ReadByte(u8 TxData)
  109. {               
  110.         u8 retry=0;                                 
  111.         while((SPI1->SR&1<<0)==0) //等待接收完一個(gè)byte  
  112.         {
  113.                 retry++;
  114.                 if(retry>200)return 0;
  115.         }                                                              
  116.         return SPI1->DR;          //返回收到的數(shù)據(jù)                                    
  117. }


  118. void SPI1_IRQHandler(void)
  119. {       
  120.         if((SPI1->SR&1<<0)==1)
  121.         {         
  122.                 Master_Temp =

  123. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

中文復(fù)制亂碼了,就沒有解釋了。
完整代碼下載:
SPI主從通信.zip (16.32 MB, 下載次數(shù): 99)



回復(fù)

使用道具 舉報(bào)

ID:169559 發(fā)表于 2017-5-3 08:00 | 顯示全部樓層
有需要的可以參考,謝謝分享 !
回復(fù)

使用道具 舉報(bào)

ID:109016 發(fā)表于 2018-7-12 16:47 | 顯示全部樓層
謝謝分享。這個(gè)程序沒問題,運(yùn)行正常。
回復(fù)

使用道具 舉報(bào)

ID:385187 發(fā)表于 2018-8-17 10:13 | 顯示全部樓層
為什么感覺并沒有連接上呢?
回復(fù)

使用道具 舉報(bào)

ID:211595 發(fā)表于 2022-11-7 13:51 | 顯示全部樓層
是兩個(gè)STM32芯片通信嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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