![]() |
發(fā)布時間: 2022-10-11 15:42
正文摘要:我使用的是STM32F103C8T6和PCAP01來做SPI1通訊。在使用的過程中發(fā)現(xiàn),SPI1有的時候使用沒有問題,通訊正常,有的時候通信失敗,SPI1用不了。如果是代碼或者硬件有問題,那應(yīng)該不能通訊,為什么有的時候好用,有的時 ... |
188610329 發(fā)表于 2022-10-12 12:49 我都在一個板上,距離很近。我將速度降低,設(shè)置為:SPI_BaudRatePrescaler_256。今天試了一天,還是連接不上,前兩天還好好的,F(xiàn)在將數(shù)值寫入,讀出來全是0xFF。還有沒有其他可能?這個我的初始化代碼。 void SPIx_I2Cx_GPIOs_Init(void* bus_type) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); //SPI1_NSS GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA4 GPIO_Init(GPIOA,&GPIO_InitStructure); //SPI1_CLK GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 GPIO_Init(GPIOA, &GPIO_InitStructure); //SPI_MISO GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//PA6 GPIO_Init(GPIOA, &GPIO_InitStructure); //SPI_MOSI GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//PA7 GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_I2S_DeInit(bus_type); //ía2¿ÖD¶Ïêäèë GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PD4 GPIO_Init(GPIOD, &GPIO_InitStructure); //SPI ENABLE Æà1à1¤¾ßêä3ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PD3 GPIO_Init(GPIOD, &GPIO_InitStructure); // SPIx Enable = 0 for SPI Mode // SPIx Enable = RSN for GP22 GPIO_WriteBit(GPIOD, GPIO_Pin_3, Bit_RESET); } void SPIx_I2Cx_Interface_Init(void* bus_type) { //3õê¼»ˉSPIx½ó¿ú SPI_InitTypeDef SPI_InitStructure; //RCC_SYSCLKConfig (RCC_SYSCLKSource_HSI); //RCC_HCLKConfig (RCC_SYSCLK_Div1); RCC_APB2PeriphResetCmd (RCC_APB2Periph_SPI1, DISABLE); RCC_APB2PeriphClockCmd (RCC_APB2Periph_SPI1, ENABLE); // All are defined in stm32f10x_spi.h SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;// SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // SPI frequence devider SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // Apply SPIx configuration SPI_Init(bus_type, &SPI_InitStructure); // Enabling the SPIx Interface SPI_Cmd(bus_type, ENABLE); // Enabling the NSS Output during transmission SPI_SSOutputCmd (bus_type, ENABLE); GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET); } |
1123qqw 發(fā)表于 2022-10-12 10:46 暈死,被帶溝里去了, 你說兩個芯片SPI通訊, 潛意識就認(rèn)為 是兩個單片機了。弄了半天是 控制器件。 PCAP01 沒有用過,不清楚,不過SPI 操控器件, 時好時壞, 無非3個原因 1,線路沒接好,有干擾,器件的供電沒有,有效的濾波。(檢查線路,排除干擾,增加濾波電容,從你的原理圖上看,6腳這里應(yīng)該添加 104電容) 2,主機的 SPI 驅(qū)動力不夠,距離較遠(yuǎn),1/0轉(zhuǎn)換不及時 (添加上拉電阻) 3,SPI 設(shè)定的傳輸速度過快,接近器件的極限值。(降低SPI的速度,測試時建議調(diào)到最慢速度。) |
yzwzfyz 發(fā)表于 2022-10-12 08:27 從機是PCAP01芯片,說明手冊并沒有給我如何設(shè)置,只是給了一個啟動SPI的方式。 |
本帖最后由 1123qqw 于 2022-10-12 10:59 編輯 188610329 發(fā)表于 2022-10-11 22:21 交換的數(shù)據(jù)為21位的浮點數(shù)。我怎么確保從機能收到呢?芯片手冊并沒有給如何設(shè)置,只是給了一個端口,設(shè)置為低電平就能啟動SPI通信。 |
你要保證,當(dāng)你發(fā)送的時候,對方在收! 建議用中斷方式解決這個問題。 |
不是指 SPI 的傳輸速度 快慢,而是指 SPI 傳指令 給 從機, 從機 接受到 指令, 處理,準(zhǔn)備數(shù)據(jù) 回傳給主機,這個過程需要時間的, 但是,時鐘是主機發(fā)出的,主機是不知道 從機 準(zhǔn)備沒準(zhǔn)備好的。 所以,這個指令的復(fù)雜程度,從機需要處理的時間, 主機這邊要有 充分的等待, 才能 發(fā)出時鐘 取數(shù)據(jù)。 同樣,主機發(fā)出 CE/SS 信號,然后發(fā)數(shù)據(jù) 給從機, 這個時候,從機在干什么? 你能不能確保,這個時候從機就 等在 SPI 線程上 等待指令接收完畢,立刻處理? 如果,這個時候,從機在處理別的事情,你又沒有機制,讓從機停止工作,來處理SPI 發(fā)來的指令? 這是 雙機通訊中必須考慮的問題。 因為,不知道你 雙機 SPI 通訊 具體進行什么 數(shù)據(jù)交互,就只能推測這些了。 |
188610329 發(fā)表于 2022-10-11 18:41 那您的意思是速度太快了嗎?可是有的時候,我再重新燒錄程序的時候,會全部復(fù)位在進行燒錄。有的時候能通信,有的時候就不行。要是因為速度的話,每次重新開始的時候,不應(yīng)該時好時壞。 |
主機需要考慮從機的響應(yīng)和處理速度。從機需要考慮在做任何處理時,都能停下手頭的工作,響應(yīng)主機的要求。 |
Powered by 單片機教程網(wǎng)