STM32的SPI可以作為master,也可以作為slave,作為slave的例程比較少,今天經過幾個小時的折騰,終于把數據獲取出來了,經驗證和元數據是一致的。現將源代碼貼在這里,供有需要的人參考。
硬件連接:
STM32(作為從設備) 外部設備
PB12-SPI2-NSS------------> CS
PB13-SPI2-SCK------------->CLK
PB14-SPI2-MISO----NC
PB15_SPI2-MOSI----------->data
STM32作為從設備的時候,獲取數據的接口為MOSI(PB15),STM32只需要從SPI接口獲取數據,不需要發送數據,因此MISO(PB14)懸空。
//SPI2作為從機接口配置
void SPI_slave(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//Enable SPI2 clock and GPIO clock for SPI2 and SPI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
//IO初始化
//Configure SPI2 pins: SCK, MISO and MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//1st phase: SPI2 slave
//SPI1 Config
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;//只接收,不發送,這個地方是重點,如果設置為單工通信是不能實現數據采集的。
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //從機模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //數據位為8
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //不發送數據時,時鐘線為高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //在第二個沿進行采樣
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; //硬NSS
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //MSB優先
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //使用中斷進行接收,因此設置NVIC的優先機組,1表示1bit搶占優先級
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable SPI2 RXNE interrupt */
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
//Enable SPI2
//SPI_Cmd(SPI2, ENABLE); //先不啟動SPI,在收到特定命令的時候再啟動
}
//中斷服務程序
void SPI2_IRQHandler(void)
{
//接收數據
//printf("SPI_IRQ %d\n",RxIdx);
SPI2_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI2);
}
int main(void)
{
int i;
SystemInit(); /* 配置系統時鐘為 72M */
LEDKEY_GPIOInit();
USART_GPIOInit();
SysTick_Configuration();
USART_Configuration(USART1, 9600);
SPI_slave();
LED1_ON;
while (1)
{
if(RxIdx==50)//接收數據滿,對數據進行處理
{
SPI_Cmd(SPI2, DISABLE);
RxIdx=0;
printf("rcv full\n");
for(i=0;i<49;i++)
printf("0x%02X\n ",SPI2_Buffer_Rx[i]);//串口輸出獲取的數據
}
if(GetKey()==1)
{
LED1_ON;
SPI_Cmd(SPI2, ENABLE);//按鍵按下后,使能SPI2,然后在中斷中接收數據
RxIdx=0;//接收數據下標清零
printf("key1\n");
}
if(GetKey()==2)
{
LED1_OFF;
}
}
}
上一篇:LPC2200系列bootloader實現過程:
下一篇:STM32F051 SPI slave mode DMA接收
推薦閱讀
史海拾趣
公司成立與初期發展:Analog Integrations Corporation(AIC)是一家總部位于臺灣的半導體公司,專注于設計、制造和銷售高性能模擬集成電路(IC)產品。公司成立于1996年,由一群擁有豐富經驗的工程師共同創立。最初,AIC致力于為廣泛的應用領域提供穩定可靠的模擬芯片解決方案,如消費電子、通信、工業控制等。
技術創新與產品發展:AIC在技術創新和產品研發方面投入了大量資源,不斷推出具有競爭力的新產品。公司的產品涵蓋了各種模擬IC產品系列,包括功率管理IC、放大器、比較器、數據轉換器等。這些產品具有高性能、低功耗、小尺寸等特點,得到了廣大客戶的青睞。
全球市場拓展:隨著公司技術和產品的不斷成熟,AIC開始著眼于國際市場的拓展。公司積極參與國際電子展覽和行業會議,與全球客戶建立合作關系,拓展海外市場份額。通過建立銷售代理商、設立海外辦事處等方式,AIC在北美、歐洲、亞太等地區建立了穩固的銷售網絡。
質量管理與認證:AIC始終將產品質量視為企業發展的關鍵。公司嚴格遵循國際質量管理體系標準,建立了完善的質量管理體系。AIC的生產工藝和產品測試流程經過精心設計和嚴格監控,確保產品質量的穩定性和可靠性。此外,公司的產品經過了多項國際認證,包括ISO 9001質量管理體系認證、ISO 14001環境管理體系認證等。
社會責任與可持續發展:作為一家負責任的企業,AIC積極履行社會責任,關注環境保護和可持續發展。公司致力于降低能源消耗和減少廢物排放,推動綠色生產和循環利用。此外,AIC積極參與社會公益活動,支持教育、健康、環保等多個領域的項目,為社會發展做出積極貢獻。
Accetek公司深知人才是企業發展的核心競爭力。因此,公司一直注重人才引進和團隊建設工作。公司通過與高校合作、舉辦招聘會等方式吸引了一批批優秀的人才加入。同時,公司還建立了完善的培訓機制和激勵機制,為員工的成長和發展提供了良好的平臺。這些優秀的人才為公司的技術創新和市場拓展提供了有力的支持。
E-T-A公司的前身可以追溯到1948年,當時由Jakob Ellenberger和Harald A. Poensgen在德國共同創立了ELPO GmbH公司。這家初創企業專注于電氣設備的研發和生產。隨著技術的不斷發展和市場的日益擴大,公司逐漸意識到設備用斷路器在電路保護領域的重要性。因此,在1953年,公司正式推出了設備用的ETA斷路器,并開始逐漸將重心轉移到斷路器領域,這也為日后E-T-A公司的成立奠定了基礎。
隨著戰爭的結束,軍事通信市場的需求逐漸減少,Bliley開始尋求新的發展機遇。公司開始將目光投向更廣泛的商業應用領域,并逐步拓展其產品線。在20世紀80年代初,Bliley開始生產SC切割晶體,這一創新使其在晶體制造領域取得了新的突破。進入21世紀,Bliley繼續加大研發力度,不斷推出新的產品和服務。2001年,公司更名為Bliley Technologies Inc.,以更好地反映其日益多樣化的產品和服務范圍。如今,Bliley已經發展成為一家提供多種頻率控制產品的全球領導者。
隨著公司的發展,EM Devices Corporation不斷加大對研發的投入,致力于推出更具創新性的產品。一次偶然的機會,公司的研發團隊發現了一種新型材料,它具有優異的電氣性能和穩定性。經過數月的艱苦研發,公司成功將這種材料應用于產品中,并推出了一款性能卓越的新型電子元件。這一創新產品不僅為公司帶來了豐厚的利潤,還進一步鞏固了公司在行業內的領先地位。
Datalogic公司自成立以來,一直致力于技術創新。在1990年代,隨著電子行業的快速發展,對高精度數據采集和處理的需求日益增加。Datalogic憑借其深厚的技術積累,成功研發出一系列高性能的條碼掃描器和數據采集器,這些產品憑借其高效、穩定的表現,迅速在電子行業占據了一席之地。
如何用定時器T2控制電機移動到一定距離自動停下,那位高手可提供代碼或方法 Atmel公司的AT89C52有定時/計數器2,可利用T2的加減計數功能.T2有兩個輸入端,T2(P1.0)為脈沖輸入端,T2EX(P1.1)為加減計數控制端。利用90°相差的信號可以實現加減計數。圓度儀的電機I 控制電感測微儀的上下位置運動,速度的大小由數據采集板的D/A ...… 查看全部問答∨ |
發起一次GPSONE就相當于建立一次DO連接,這個可以通過QXDM信令中看到, 我現在默認的operation mode = MS-assisted,我試過將operation mode 設置成MS-Based Mode或者tandalone mode,但是都不成功,無法建立DO連接,請問如何變化模式到MS-Based Mode ...… 查看全部問答∨ |
在嵌入式開發板上移植l2tp客戶端rp-l2tp后運行l2tpd守護進程出現could not dload sync-pppd.so:File not found,但在lib下是有sync-pppd.so的,在板子上是無法設置動態庫搜索路徑的,有那位大蝦作過或者是碰到過類似的問題的希望能指點一二,謝謝!… 查看全部問答∨ |
XIPKERNEL.BIN下載出錯?如下所示,我將所有文件都包含到xipkernel里,下載到ARM時缺認為格式錯誤, 請問什么原因,是EBOOT版本問題嗎? Download BIN file information: ----------------------------------------------------- [0]: Base A ...… 查看全部問答∨ |
開始做一下自我介紹吧,我是一名湘潭大學05級自動化專業的學生。性格能內能外,覺得 還應該不斷完美。下面說一說我大學前面三年的生活吧。 大一大二沒學什么課外的知識,平平淡淡,如果參加社團不算的話。大三有機會 ...… 查看全部問答∨ |
我的硬件原理圖如下鏈接:請放心打開! http://www.dzjia.cn/html/jiejuefangan/20070619/24939_2.html 如圖示:P2.7接到RC500的NCS片選腳上,這時我想要訪問RC500的內部地址,我就應該先定義要訪問的地址,如下: #define Page_Sel   ...… 查看全部問答∨ |
系統SPI1和SPI2工作正常,SPI3初始化后引腳狀態都不對,請版主指點,謝謝! RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ...… 查看全部問答∨ |