国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

stm32 GPIO模擬SPI接口實現(xiàn)雙機通信

這篇具有很好參考價值的文章主要介紹了stm32 GPIO模擬SPI接口實現(xiàn)雙機通信。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、SPI協(xié)議簡介
? ? 一般主從方式工作,這種模式通常有一個主設備和一個或多個從設備,通常采用的是4根線,它們是MISO(主機輸入從機輸出)、MOSI(主機輸出,針對主機來說)、SCLK(時鐘,主機產(chǎn)生)、CS(片選,一般由主機發(fā)送或者直接使能,通常為低電平有效)

●SPI接口介紹

SCK:時鐘信號,由主設備產(chǎn)生,所以主設備SCK信號為推挽輸出模式,從設備的SCK信號為浮空輸入模式。

CS:使能信號,由主設備控制從設備,,所以主設備CS信號為推挽輸出模式,從設備的CS信號為浮空輸入模式。

MOSI:主設備數(shù)據(jù)輸出,從設備數(shù)據(jù)輸入,所以主設備MOSI信號為推挽輸出模式,從設備的MOSI信號為浮空輸入模式。

MISO:主設備數(shù)據(jù)輸入,從設備數(shù)據(jù)輸出,所以主設備MISO信號為浮空輸入模式,從設備的MISO信號為推挽輸出模式。

二、四種模式(本次模擬采用的模式0)

模式0:CPOL=0,CPHA =0 ?SCK空閑為低電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))

模式1:CPOL=0,CPHA =1 ?SCK空閑為低電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))

模式2:CPOL=1,CPHA =0 ?SCK空閑為高電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))

模式3:CPOL=1,CPHA =1 ?SCK空閑為高電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))

三、雙機通信實現(xiàn)

1、GPIO引腳

PC8為CS引腳? ? ? ? PC10為CLK引腳? ? ? ? PC11為MISO引腳? ? ? ? PC12為MOSI引腳

2、時序

首先主機將片選拉低(使能片選),在時鐘為低電平時向從機發(fā)送數(shù)據(jù),從機通過檢測MOSI線上的高低電平實現(xiàn)數(shù)據(jù)的接收。在時鐘為高電平時主機檢測MISO線上的高低電平來實現(xiàn)數(shù)據(jù)的接收。

主機在時鐘信號為低電平時發(fā)送單字節(jié)的最高位,然后將該字節(jié)左移一位,然后將時鐘信號拉高,此時從機檢測到時鐘信號為高電平(時鐘上升沿),從而檢測MOSI線上的高低電平并將得到的高低電平放到變量中。同時從機向主機發(fā)送數(shù)據(jù),即改變MISO線上的高低電平。此過程重復8次,即可完成發(fā)送和接收一個字節(jié)的數(shù)據(jù)。

四、代碼如下

1、主設備GPIO的配置

void SPI_GPIO_Init(void){
	GPIO_InitTypeDef GPIO_InitStructure;			//定義結構體類型的變量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	 		//使能GPIOC的端口時種
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;					//推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;					//IO口速度為50Mhz
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;					//浮空輸入
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOC,GPIO_Pin_8);	//CS拉高
	GPIO_ResetBits(GPIOC,GPIO_Pin_10);//CLK拉低
	GPIO_ResetBits(GPIOC,GPIO_Pin_11);	
}

2、主設備向從設備寫以及讀

/*
*********************************************************************************************************
*	函 數(shù) 名: SPI_WRByte
*	形    參: spi; wdat:寫入的數(shù)據(jù)
*	返 回 值: spi讀一個字節(jié)
*	功能說明: 主機spi同時讀寫一個字節(jié)的時序		MSB
*********************************************************************************************************
*/
u8 Master_SPI_WRByte(u8 wdat)
{
	u8 i=0,rdat=0;
	SPI_CS_LOW;
	for(i=0;i<8;i++)
	{
		if(wdat&0x80)
			SPI_MOSI_HIGH;
		else
			SPI_MOSI_LOW;
		wdat<<=1;
		delay_us(3);	
				
		SPI_CLK_HIGH;
				
		delay_us(2);
		rdat<<=1;
		if(SPI_MISO_READ)
			rdat |= 0x01;
		
		delay_us(1);
		
		SPI_CLK_LOW;
	}
	SPI_CS_HIGH;
	return rdat;	
}

3、從設備GPIO設置

void SPI_GPIO_Init(void){
	GPIO_InitTypeDef GPIO_InitStructure;			//定義結構體類型的變量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	 		//使能GPIOC的端口時種
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;					//推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;					//IO口速度為50Mhz
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;					//浮空輸入
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_11);	
}

4、從設備讀寫函數(shù)

u8 Slave_SPI_RWByte(u8 wdat){
	u8 i=0,dat=0;
	if(!SPI_CS_READ){		//檢測到片選拉低
		for(i=0;i<8;i++)
		{		
			while(!SPI_CLK_READ);		//檢測到時鐘上升沿的到來	
						
			if(wdat&0x80)SPI_MISO_HIGH;	//MSB
			else SPI_MISO_LOW;
			wdat<<=1;
			
			dat<<=1;
			if(SPI_MOSI_READ)dat |= 0x01;				
			while(SPI_CLK_READ);		
		}			
	}	
	return dat;	
}

5、頭文件

#define SELECT    1		//0表示主機  其它表示從機

#if SELECT==0
//主機
//CS引腳
#define      SPI_CS_HIGH        PCout(8)=1
#define      SPI_CS_LOW         PCout(8)=0

//CLK引腳
#define      SPI_CLK_HIGH       PCout(10)=1
#define      SPI_CLK_LOW        PCout(10)=0


//MISO引腳
#define      SPI_MISO_READ      PCin(11)

//MOSI引腳
#define      SPI_MOSI_HIGH      PCout(12)=1
#define      SPI_MOSI_LOW       PCout(12)=0
void SPI_GPIO_Init(void);
u8 Master_SPI_WRByte(u8 wdat);


#else
//從機
//CS引腳
#define      SPI_CS_READ        PCin(8)

//CLK引腳
#define      SPI_CLK_READ       PCin(10)

//MISO引腳
#define      SPI_MISO_HIGH      PCout(11)=1
#define      SPI_MISO_LOW       PCout(11)=0

//MOSI引腳
#define      SPI_MOSI_READ      PCin(12)
void SPI_GPIO_Init(void);
u8 Slave_SPI_RWByte(u8 wdat);
#endif

6、主函數(shù)

 int main(void)
{	
	u8 key;
	delay_init();	    	 //延時函數(shù)初始化	  
	led_init();		  	//初始化與LED連接的硬件接口
	key_init();
	SPI_GPIO_Init();
	while(1)
	{
#if SELECT==0
	key=key_scan(0);
	switch(key){
		case key_up_value:{
			if(Master_SPI_WRByte(0x50)==0x60)LED1=!LED1;
			break;
		};
		case key_down_value:{
			
			break;
		};
		case key_left_value:{
			
			break;
		};
		case key_right_value:{
			
			break;
		};

	}		
		
#else
	Slave_SPI_RWByte(0x60);


	
#endif

五、實驗說明

本實驗通過主機向從機發(fā)送0x50命令來控制從機LED1亮滅。其他應用層的使用讀者可自行完成。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-404014.html

到了這里,關于stm32 GPIO模擬SPI接口實現(xiàn)雙機通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • STM32使用SPI協(xié)議主從通信

    STM32使用SPI協(xié)議主從通信

    目錄 前言 一、理論部分? ??? SPI簡介?? SPI特征 SPI物理層 SPI協(xié)議層 SPI配置過程 SPI數(shù)據(jù)發(fā)送與接收過程 二、代碼部分 主機代碼 從機代碼 這是一篇學習筆記,記錄自己學習SPI通信。方便之后運用的時候回顧。參考《STM32中文參考手冊》 ?????????SPI 協(xié)議是由摩托羅拉公

    2024年02月13日
    瀏覽(23)
  • STM32 SPI通信協(xié)議1——協(xié)議基本原理及管腳定義

    STM32 SPI通信協(xié)議1——協(xié)議基本原理及管腳定義

    ????????SPI全稱為 Serial Peripheral interface ,譯為 串行外圍設備接口 。SPI主要應用在EEPROM,F(xiàn)LASH,實時時鐘,AD轉(zhuǎn)換器,還有數(shù)字信號處理器和數(shù)字信號編碼器之間。 ? ? ? ? SPI是一種高速,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,

    2024年01月25日
    瀏覽(26)
  • 【STM32學習】——SPI通信協(xié)議&SPI時序&W25Q64存儲芯片&軟件SPI讀寫

    【STM32學習】——SPI通信協(xié)議&SPI時序&W25Q64存儲芯片&軟件SPI讀寫

    目錄 前言 一、SPI通信協(xié)議 1.概述? 2.硬件電路 ?3.移位示意圖 二、SPI時序 1.時序基本單元 2.完整時序波形 三、W25Q64存儲芯片 1.芯片簡介 ?2.硬件電路引腳定義 ?3.芯片框圖 4.Flash操作注意事項 四、軟件SPI讀寫W25Q64 五、SPI通信外設 總結 聲明:學習筆記來自江科大自化協(xié)B站教

    2024年02月09日
    瀏覽(21)
  • STM32模擬SPI協(xié)議控制數(shù)字電位器MCP41010電阻值

    STM32模擬SPI協(xié)議控制數(shù)字電位器MCP41010電阻值

    MCP41010是單路8位分辨率數(shù)字電位器,通過SPI接口可控制電位器阻值分配,相當于PW0端在PA0和PB0之間滑動。如下圖所示: MCP41010是10K歐姆規(guī)格的數(shù)字電位器,即PA0和PB0之間的阻值恒定為10K,PW0與PA0或PW0與PB0之間的阻值互補可配。 另外有相關型號不同阻值規(guī)格和集成雙路的MCP系列

    2024年02月16日
    瀏覽(22)
  • STM-32:SPI通信協(xié)議/W25Q64簡介—軟件SPI讀寫W25Q64

    STM-32:SPI通信協(xié)議/W25Q64簡介—軟件SPI讀寫W25Q64

    SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是美國摩托羅拉公司(Motorola)最先推出的一種同步串行傳輸規(guī)范,也是一種單片機外設芯片串行擴展接口,是一種高速、全雙工、同步通信總線,所以可以在同一時間發(fā)送和接收數(shù)據(jù),SPI沒有定義速度限制,通常能達到甚

    2024年02月16日
    瀏覽(19)
  • 【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S)

    【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S)

    SPI,英文全稱Serial Peripheral Interface,即串行外圍設備接口,是一種高速、全雙工、同步的串行通信總線。 我們之前說過I2C,那么我們就拿I2C和SPI做個對比。 SPI和I2C對比,優(yōu)勢在于SPI的傳輸速率比I2C快得多,劣勢在于SPI需要用的通信線比較多。 I2C只需要兩根線,而SPI至少需要

    2024年04月27日
    瀏覽(28)
  • STM32模擬SPI協(xié)議獲取24位模數(shù)轉(zhuǎn)換(24bit ADC)芯片AD7791電壓采樣數(shù)據(jù)

    STM32模擬SPI協(xié)議獲取24位模數(shù)轉(zhuǎn)換(24bit ADC)芯片AD7791電壓采樣數(shù)據(jù)

    STM32大部分芯片只有12位的ADC采樣性能,如果要實現(xiàn)更高精度的模數(shù)轉(zhuǎn)換如24位ADC采樣,則需要連接外部ADC實現(xiàn)。AD7791是亞德諾(ADI)半導體一款用于低功耗、24位Σ-Δ型模數(shù)轉(zhuǎn)換器(ADC) ,適合低頻測量應用,提供50 Hz/60 Hz同步抑制。 這里介紹基于AD7791的24位ADC采樣實現(xiàn)。 AD7791的管腳

    2024年02月09日
    瀏覽(41)
  • 【接口協(xié)議】FPGA實現(xiàn)SPI協(xié)議基于ADC128S022進行模擬信號采集

    【接口協(xié)議】FPGA實現(xiàn)SPI協(xié)議基于ADC128S022進行模擬信號采集

    使用vivado聯(lián)合modelsim實現(xiàn)SPI協(xié)議基于ADC128S022進行模擬信號連續(xù)采集。 SPI是串行外設接口,是一種同步/全雙工/主從式接口。通常由四根信號線構成: CS_N :片選信號,主從式接口,可以有多個從機,用片選信號進行從機選擇; SCLK :串行時鐘線,由主機提供給從機; MISO :主機

    2024年02月07日
    瀏覽(23)
  • 基于SPI實現(xiàn)stm32與fpga通信(一)

    SPI通信協(xié)議有以下4種模式: 模式0:時鐘極性為0,時鐘相位為0,數(shù)據(jù)在時鐘下降沿捕獲,數(shù)據(jù)在時鐘上升沿改變。 模式1:時鐘極性為0,時鐘相位為1,數(shù)據(jù)在時鐘上升沿捕獲,數(shù)據(jù)在時鐘下降沿改變。 模式2:時鐘極性為1,時鐘相位為0,數(shù)據(jù)在時鐘上升沿捕獲,數(shù)據(jù)在時鐘

    2024年04月16日
    瀏覽(43)
  • 普冉PY32系列(九) GPIO模擬和硬件SPI方式驅(qū)動無線收發(fā)芯片XL2400

    普冉PY32系列(九) GPIO模擬和硬件SPI方式驅(qū)動無線收發(fā)芯片XL2400

    普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU簡介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode開發(fā)環(huán)境 普冉PY32系列(三) PY32F002A資源實測 - 這個型號不簡單 普冉PY32系列(四) PY32F002A/003/030的時鐘設置 普冉PY32系列(五) 使用JLink RTT代替串口輸出日志 普冉PY32系列(六) 通過I2C接口驅(qū)動PCF8574擴

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包