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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM8L的SPI1基本讀寫方法詳解 含例程

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140343 發(fā)表于 2016-10-10 00:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM8L的硬件SPI1共有三個主要引腳,分別是MOSI,MISO,SCK。NSS引腳只有在SMT8L作為從設備時,才有用,用于判斷是否被選擇與SPI主設備通信。本文選取NRF24L01作為SPI從設備,STM8L作為主設備,進行SPI讀寫功能測試。

下圖是淘寶上可以買到的最常見的NRF24L01模塊引腳圖,可以看到除了MOSI,MISO,SCK,三個和SPI1硬件有關(guān)的引腳外,還有CE,CSN,IRQ這三個引腳,這三個引腳用STM8L的普通IO驅(qū)動即可.

從下圖可以看到,CSN為芯片的使能引腳,讀寫寄存器時CSN必須為低電平.CE配合的內(nèi)部配置寄存器,決定NRF24L01狀態(tài).

本例中,STM8L作為SPI主設備,在STM8L用戶手冊關(guān)于SPI作為主設備的詳細配置流程如下圖.


本文只是簡單的測試SPI的讀寫功能,通過標志位等待實現(xiàn)硬件SPI讀寫單個字節(jié).沒有使用中斷和DMA功能.
注意:向NRF24L01寫數(shù)據(jù)時,需要在寄存器地址加上0x20,用于指示下一字節(jié)發(fā)送的數(shù)據(jù)是寫入這個寄存器的.
下圖是實際調(diào)試結(jié)果截圖,查看NRF24L01的數(shù)據(jù)手冊,可以知道0x00,0x01,0x02這三個寄存器的復位值分別為0x08,0x3F,0x03.由于0x00這個寄存器中的數(shù)據(jù)被我改寫過了,所以這里顯示改寫值0x55.

  1. /*硬件連接*

  2. //    STM8L          NRF24L01

  3. //    PB4     -->      CSN

  4. //    PD4     -->      CE

  5. //    PB5     -->      SCK

  6. //    PB6     -->      MOSI

  7. //    PB7     <--      MISO

  8. /****************************************************************************************

  9. *開發(fā)環(huán)境:IAR for stm8 v1.40.1

  10. *硬件平臺:STM8L-DISCOVERY

  11. *功能說明:通過硬件SPI等待的方法,實現(xiàn)對NRF24L01寄存器的讀寫,借助IAR軟件的調(diào)試功能,查看變量的數(shù)值

  12. *作    者:茗風

  13. ****************************************************************************************/

  14. #include"iostm8l152c6.h"

  15. #include"stdbool.h"

  16. #include"stdint.h"

  17.   

  18. #define CSN_H           PB_ODR_ODR4=1

  19. #define CSN_L                  PB_ODR_ODR4=0

  20. #define CE_H            PD_ODR_ODR4=1

  21. #define CE_L            PD_ODR_ODR4=0

  22. uint16_t VDD_Value=0;

  23. /******************************************************************************************************

  24. *  名    稱:void delay_10ms(uint8_t x_ms)

  25. *  功    能:延時10ms

  26. *  入口參數(shù):無

  27. *  出口參數(shù):無

  28. *  說    明:

  29. *  范    例:無

  30. ******************************************************************************************************/

  31. void delay_100ms(void)

  32. {

  33.   uint8_t i,j;

  34.   for(i=0;i<255;i++)//2*255個指令周期

  35.     for(j=0;j<255;j++);//2*255個指令周期

  36.   //delay_10ms共消耗 x_ms*2*255+2*x_ms個指令周期  

  37.   //255*2*255+2*255=130610us=130ms

  38.   //此延時函數(shù),延時時間為130ms

  39.   //16M/8/2=1M 一個指令周期為1us

  40. }


  41. ///******************************************************************** **********************************

  42. //*  功  能   :SPI基本寫一個字節(jié)函數(shù)

  43. //*  入口參數(shù)   :address為寄存器地址

  44. //            data為寫入數(shù)據(jù)

  45. //*  出口參數(shù)   :無

  46. //*  說  明   :SPI文件提供基本的寫函數(shù),具體的器件寫方式可能不同,建議使用基本函數(shù)進行封裝

  47. //*  范  例   :無

  48. //******************************************************************************************************/

  49. void SPI1_Write_REG(uint8_t address,uint8_t data)

  50. {

  51.     uint8_t tmp;

  52.     address |=0x20;

  53.     CSN_L;

  54.     SPI1_DR=address;//寫入需要操作的寄存器地址,

  55.     while(!(SPI1_SR_RXNE));

  56.     tmp=SPI1_DR;   //讀取數(shù)據(jù),僅僅是為了清除標志位

  57.     while(!(SPI1_SR_TXE));//等待發(fā)送寄存器為空

  58.     SPI1_DR=data;

  59.     while(!(SPI1_SR_TXE));

  60.     CSN_H;

  61. }


  62. ///******************************************************************** **********************************

  63. //*  功  能        :SPI基本讀一個字節(jié)函數(shù)

  64. //*  入口參數(shù)        :address為寄存器地址

  65. //*  出口參數(shù)        :無

  66. //*  說  明        :SPI文件提供基本的讀函數(shù),具體的器件讀方式可能不同,建議使用基本函數(shù)進行封裝

  67. //*  范  例        :無

  68. //******************************************************************************************************/

  69. uint8_t SPI1_Read_REG(uint8_t address)

  70. {

  71.   volatile uint8_t value=0;

  72.   CSN_L;

  73.   value=SPI1_DR;//讀一次,清除標志位

  74.   while(!(SPI1_SR_TXE));

  75.   SPI1_DR=address;//寫入需要操作的寄存器地址,

  76.   

  77.   while(!(SPI1_SR_RXNE));

  78.   value=SPI1_DR;

  79.   

  80.   while(!(SPI1_SR_TXE));

  81.   SPI1_DR=0xFF;//寫入一個無效值

  82.   

  83.   while(!(SPI1_SR_RXNE));//準備讀數(shù)據(jù)

  84.   value=SPI1_DR;

  85.   CSN_H;

  86.   return value;

  87. }

  88. /******************************************************************************************************

  89. * 名 稱: SPI_init()

  90. * 功 能:初始化SPI

  91. * 入口參數(shù):無

  92. * 出口參數(shù):無

  93. * 說 明: SP1傳輸速率設置為fmaster/2=8M,主模式,

  94. * 范 例:無

  95. ******************************************************************************************************/

  96. void SPI_Init(void)

  97. {

  98.   static uint8_t temp0=0,temp1=0,temp2=0,temp3=0;

  99. //輸出IO

  100.   PD_DDR_DDR4 =1;//CE設置為輸出

  101.   PB_DDR_DDR4 =1;//CSN設置為輸出

  102.   PB_DDR_DDR5 =1;//SCK設置為輸出

  103.   PB_DDR_DDR6 =1;//SIMO設置為輸出

  104.   

  105.   PD_CR1_C14 =1;//CE設置為推挽輸出

  106.   PB_CR1_C14 =1;//CSN設置為推挽輸出

  107.   PB_CR1_C15 =1;//SCK設置為推挽輸出

  108.   PB_CR1_C16 =1;//SIMO設置為推挽輸出

  109.   

  110.   PB_CR2_C26 =1;//SIMO的IO輸出速率為10MHz

  111.   PB_CR2_C25 =1;//SCK的IO輸出速率為10MHz

  112.   PD_CR2_C24 =1;//CE的IO輸出速率為10MHz

  113.   PB_CR2_C24 =1;//CSN的IO輸出速率為10MHz

  114.   

  115. //輸入IO

  116.   PD_DDR_DDR5 =0;//IRQ設置為輸入

  117.   PB_DDR_DDR7 =0;//SOMI設置為輸入

  118.   

  119.   PD_CR1_C15 =1;//IRQ設置為帶上拉電阻輸入

  120.   PB_CR1_C17 =1;//SOMI設置帶上拉電阻輸入

  121.   

  122.   PD_CR2_C25 =0;//關(guān)閉IRQ中斷

  123.   PB_CR2_C27 =0;//關(guān)閉中斷



  124.   

  125.   CLK_PCKENR1_PCKEN14=1;//打開SPI1外設時鐘

  126.   

  127.   SPI1_CR1_SPE=0;//關(guān)閉SPI設備

  128.   //設置串行波特率

  129.   SPI1_CR1_BR=0;//fmaster/2=1M

  130.   

  131.   //配置CPOL和CPHA,定義數(shù)據(jù)傳輸和串行時鐘間的相位關(guān)系

  132.   SPI1_CR1_CPHA=0;//數(shù)據(jù)采樣從第一個時鐘邊沿開始

  133.   SPI1_CR1_CPOL=0;//空閑狀態(tài)時,SCK保持低電平  

  134.   

  135.    //定義幀格式

  136.   SPI1_CR1_LSBFIRST=0;//先發(fā)送MSB

  137.   

  138.     //使能從設備管理//主模式需通過改變SSI位 來控制SPI_SEL

  139.   SPI1_CR2_SSM=1;//禁止軟件從設備

  140.   SPI1_CR2_SSI=1;

  141.   

  142.   //主從設備模式選擇

  143.   SPI1_CR1_MSTR=1;//作為主設備

  144.   

  145.   SPI1_CR2_RXONLY=0;//全雙工

  146.   SPI1_CR2_BDM=0;//選擇單向數(shù)據(jù)模式

  147.   

  148.   SPI1_CR1_SPE=1;//開啟SPI設備

  149.   

  150. //NRF24L01上電復位后需要100ms才能進入到掉電模式

  151. //配置NRF24L01之前必須要有100ms以上的延時

  152.   delay_100ms();

  153.   //至此NRF24L01進入到掉電模式,允許對NRF24L01寄存器進行讀寫操作

  154.   CE_L;

  155.   CSN_H;

  156.   PB_DDR_DDR5=0;//SCK_L

  157.   

  158. /************以下,幾個讀寫操作,是為了測試SPI讀寫功能*****************/  

  159.   temp0=SPI1_Read_REG(0x00);//

  160.   temp1=SPI1_Read_REG(0x01);//0x3F

  161.   temp2=SPI1_Read_REG(0x02);//0x03



  162.   SPI1_Write_REG(0x00,0x38);

  163.   temp3=SPI1_Read_REG(0x00);

  164.   asm("nop");

  165. }

  166. void main(void)

  167. {

  168.   SPI_Init();

  169. //  asm("rim");               //enable interrupts

  170.   while(1)

  171.   {

  172.     asm("wfi");

  173.   }

  174. }
復制代碼




評分

參與人數(shù) 1黑幣 +5 收起 理由
QWEFXSDFB + 5

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:237191 發(fā)表于 2017-10-4 00:38 | 只看該作者
炒雞感謝,原來STM8L的SPI要將MISO口設為輸入,明明STM32都是設置復用輸出的,STM8S根本不需要配置IO口,坑爹啊,困擾一天的BUG終于解決了,多謝!!!
回復

使用道具 舉報

板凳
ID:281021 發(fā)表于 2018-4-12 08:58 | 只看該作者
謝謝分享,超級有用!
回復

使用道具 舉報

地板
ID:203038 發(fā)表于 2018-4-27 23:10 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

5#
ID:277370 發(fā)表于 2018-9-18 11:32 | 只看該作者
剛剛要學習這塊芯片。。。學習學習啦。。
回復

使用道具 舉報

6#
ID:18591 發(fā)表于 2019-2-28 23:30 | 只看該作者
不錯~~~~~~~~~~~~~~~~
回復

使用道具 舉報

7#
ID:622341 發(fā)表于 2019-10-11 15:51 | 只看該作者
感謝分享
回復

使用道具 舉報

8#
ID:342258 發(fā)表于 2019-11-19 22:43 | 只看該作者
多謝!好人一生平安!
回復

使用道具 舉報

9#
ID:1023716 發(fā)表于 2023-8-22 01:53 | 只看該作者
這個例程比較好,幾乎所有的語句都有注釋。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品久久一区二区三区 | 91亚洲精华国产 | 成人夜晚看av | 国产欧美一级 | 91欧美激情一区二区三区成人 | 国产视频一区二区在线观看 | 亚洲视频在线一区 | 伊人青青久久 | 中文字幕亚洲国产 | 一区免费 | 黄色中文字幕 | 亚洲免费视频网址 | www.国产精品| 亚洲精品久久久一区二区三区 | 中文字幕日韩欧美 | 日韩精品一区二区三区免费视频 | 国产在线观看网站 | 国产精品成人在线播放 | 日韩中文在线观看 | 国产一区二区精 | 中文字幕不卡 | 久久久在线视频 | 成人免费观看男女羞羞视频 | 久久国产欧美日韩精品 | 欧美激情综合网 | www.日韩av.com | 欧美在线一区二区三区 | 婷婷五月色综合 | 久久久久中文字幕 | 国产成人精品一区二区在线 | 91精品国产综合久久久久久 | 国产婷婷精品 | 国产欧美精品一区二区三区 | 在线成人www免费观看视频 | 国产成人一区二区 | 黑人巨大精品欧美一区二区免费 | 天堂一区二区三区四区 | 国产一区二区免费电影 | 欧美精品一区二区三区在线播放 | 亚洲精品一区在线观看 | 日韩在线免费视频 |