熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2022-10-11 15:42
正文摘要:我使用的是STM32F103C8T6和PCAP01來(lái)做SPI1通訊。在使用的過(guò)程中發(fā)現(xiàn),SPI1有的時(shí)候使用沒(méi)有問(wèn)題,通訊正常,有的時(shí)候通信失敗,SPI1用不了。如果是代碼或者硬件有問(wèn)題,那應(yīng)該不能通訊,為什么有的時(shí)候好用,有的時(shí) ... |
188610329 發(fā)表于 2022-10-12 12:49 我都在一個(gè)板上,距離很近。我將速度降低,設(shè)置為:SPI_BaudRatePrescaler_256。今天試了一天,還是連接不上,前兩天還好好的。現(xiàn)在將數(shù)值寫(xiě)入,讀出來(lái)全是0xFF。還有沒(méi)有其他可能?這個(gè)我的初始化代碼。 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 暈死,被帶溝里去了, 你說(shuō)兩個(gè)芯片SPI通訊, 潛意識(shí)就認(rèn)為 是兩個(gè)單片機(jī)了。弄了半天是 控制器件。 PCAP01 沒(méi)有用過(guò),不清楚,不過(guò)SPI 操控器件, 時(shí)好時(shí)壞, 無(wú)非3個(gè)原因 1,線(xiàn)路沒(méi)接好,有干擾,器件的供電沒(méi)有,有效的濾波。(檢查線(xiàn)路,排除干擾,增加濾波電容,從你的原理圖上看,6腳這里應(yīng)該添加 104電容) 2,主機(jī)的 SPI 驅(qū)動(dòng)力不夠,距離較遠(yuǎn),1/0轉(zhuǎn)換不及時(shí) (添加上拉電阻) 3,SPI 設(shè)定的傳輸速度過(guò)快,接近器件的極限值。(降低SPI的速度,測(cè)試時(shí)建議調(diào)到最慢速度。) |
yzwzfyz 發(fā)表于 2022-10-12 08:27 從機(jī)是PCAP01芯片,說(shuō)明手冊(cè)并沒(méi)有給我如何設(shè)置,只是給了一個(gè)啟動(dòng)SPI的方式。 |
本帖最后由 1123qqw 于 2022-10-12 10:59 編輯 188610329 發(fā)表于 2022-10-11 22:21 交換的數(shù)據(jù)為21位的浮點(diǎn)數(shù)。我怎么確保從機(jī)能收到呢?芯片手冊(cè)并沒(méi)有給如何設(shè)置,只是給了一個(gè)端口,設(shè)置為低電平就能啟動(dòng)SPI通信。 |
你要保證,當(dāng)你發(fā)送的時(shí)候,對(duì)方在收!! 建議用中斷方式解決這個(gè)問(wèn)題。 |
不是指 SPI 的傳輸速度 快慢,而是指 SPI 傳指令 給 從機(jī), 從機(jī) 接受到 指令, 處理,準(zhǔn)備數(shù)據(jù) 回傳給主機(jī),這個(gè)過(guò)程需要時(shí)間的, 但是,時(shí)鐘是主機(jī)發(fā)出的,主機(jī)是不知道 從機(jī) 準(zhǔn)備沒(méi)準(zhǔn)備好的。 所以,這個(gè)指令的復(fù)雜程度,從機(jī)需要處理的時(shí)間, 主機(jī)這邊要有 充分的等待, 才能 發(fā)出時(shí)鐘 取數(shù)據(jù)。 同樣,主機(jī)發(fā)出 CE/SS 信號(hào),然后發(fā)數(shù)據(jù) 給從機(jī), 這個(gè)時(shí)候,從機(jī)在干什么? 你能不能確保,這個(gè)時(shí)候從機(jī)就 等在 SPI 線(xiàn)程上 等待指令接收完畢,立刻處理? 如果,這個(gè)時(shí)候,從機(jī)在處理別的事情,你又沒(méi)有機(jī)制,讓從機(jī)停止工作,來(lái)處理SPI 發(fā)來(lái)的指令? 這是 雙機(jī)通訊中必須考慮的問(wèn)題。 因?yàn)椋恢滥?nbsp; 雙機(jī) SPI 通訊 具體進(jìn)行什么 數(shù)據(jù)交互,就只能推測(cè)這些了。 |
188610329 發(fā)表于 2022-10-11 18:41 那您的意思是速度太快了嗎?可是有的時(shí)候,我再重新燒錄程序的時(shí)候,會(huì)全部復(fù)位在進(jìn)行燒錄。有的時(shí)候能通信,有的時(shí)候就不行。要是因?yàn)樗俣鹊脑?huà),每次重新開(kāi)始的時(shí)候,不應(yīng)該時(shí)好時(shí)壞。 |
主機(jī)需要考慮從機(jī)的響應(yīng)和處理速度。從機(jī)需要考慮在做任何處理時(shí),都能停下手頭的工作,響應(yīng)主機(jī)的要求。 |
Powered by 單片機(jī)教程網(wǎng)