找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

兩個芯片的SPI通信問題?

查看數(shù): 1988 | 評論數(shù): 8 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2022-10-11 15:42

正文摘要:

我使用的是STM32F103C8T6和PCAP01來做SPI1通訊。在使用的過程中發(fā)現(xiàn),SPI1有的時候使用沒有問題,通訊正常,有的時候通信失敗,SPI1用不了。如果是代碼或者硬件有問題,那應(yīng)該不能通訊,為什么有的時候好用,有的時 ...

回復(fù)

ID:391219 發(fā)表于 2022-10-12 21:12
188610329 發(fā)表于 2022-10-12 12:49
暈死,被帶溝里去了, 你說兩個芯片SPI通訊, 潛意識就認(rèn)為 是兩個單片機了。弄了半天是 控制器件。

P ...

我都在一個板上,距離很近。我將速度降低,設(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);
       
}
ID:624769 發(fā)表于 2022-10-12 12:49
1123qqw 發(fā)表于 2022-10-12 10:46
交換的數(shù)據(jù)為21位的浮點數(shù)。我怎么確保從機能收到呢?芯片手冊并沒有給如何設(shè)置,只是給了一個端口,設(shè)置 ...

暈死,被帶溝里去了, 你說兩個芯片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)到最慢速度。)

ID:391219 發(fā)表于 2022-10-12 10:58
yzwzfyz 發(fā)表于 2022-10-12 08:27
你要保證,當(dāng)你發(fā)送的時候,對方在收!
建議用中斷方式解決這個問題。

從機是PCAP01芯片,說明手冊并沒有給我如何設(shè)置,只是給了一個啟動SPI的方式。
ID:391219 發(fā)表于 2022-10-12 10:46
本帖最后由 1123qqw 于 2022-10-12 10:59 編輯
188610329 發(fā)表于 2022-10-11 22:21
不是指 SPI 的傳輸速度 快慢,而是指  SPI  傳指令 給 從機, 從機 接受到 指令, 處理,準(zhǔn)備數(shù)據(jù) 回傳給主 ...

交換的數(shù)據(jù)為21位的浮點數(shù)。我怎么確保從機能收到呢?芯片手冊并沒有給如何設(shè)置,只是給了一個端口,設(shè)置為低電平就能啟動SPI通信。
ID:123289 發(fā)表于 2022-10-12 08:27
你要保證,當(dāng)你發(fā)送的時候,對方在收!
建議用中斷方式解決這個問題。
ID:624769 發(fā)表于 2022-10-11 22:21
不是指 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ù)交互,就只能推測這些了。
ID:391219 發(fā)表于 2022-10-11 19:36
188610329 發(fā)表于 2022-10-11 18:41
主機需要考慮從機的響應(yīng)和處理速度。從機需要考慮在做任何處理時,都能停下手頭的工作,響應(yīng)主機的要求。

那您的意思是速度太快了嗎?可是有的時候,我再重新燒錄程序的時候,會全部復(fù)位在進行燒錄。有的時候能通信,有的時候就不行。要是因為速度的話,每次重新開始的時候,不應(yīng)該時好時壞。
ID:624769 發(fā)表于 2022-10-11 18:41
主機需要考慮從機的響應(yīng)和處理速度。從機需要考慮在做任何處理時,都能停下手頭的工作,響應(yīng)主機的要求。

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

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

快速回復(fù) 返回頂部 返回列表