久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1837|回復: 8
打印 上一主題 下一主題
收起左側

兩個芯片的SPI通信問題?

[復制鏈接]
跳轉到指定樓層
樓主
我使用的是STM32F103C8T6和PCAP01來做SPI1通訊。在使用的過程中發現,SPI1有的時候使用沒有問題,通訊正常,有的時候通信失敗,SPI1用不了。如果是代碼或者硬件有問題,那應該不能通訊,為什么有的時候好用,有的時候不好用。想問問大家,有沒有遇到這種情況的?
這是我的代碼:
unsigned char Send_24Bit_Opcode(unsigned char command, unsigned short address, unsigned char data)
{

  unsigned char    Result_read = 0;

  // x >> y, mean x is shifted by y bit-positions to the right
  unsigned char Byte_0  = data;
  unsigned char Byte_1  = address;
  unsigned char Byte_2  = address>>8 | command;
  // SPIx BUS_TYPE -------------------------------------------------------------

  // Deactivating Reset SPIx
  GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
  // GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);

   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==0) {}
   SPI_I2S_SendData(SPI1, Byte_2);     // send byte 2

   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==0) {}
   SPI_I2S_SendData(SPI1, Byte_1);     // send byte 1
   if (command==0x90) // write command
   {
     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==0) {}
     SPI_I2S_SendData(SPI1, Byte_0);     // send byte 0

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==0) {}
    Simple_delay_43ns((void*)10); // important delay (16) at SPI freq.=750kHz
   }

   if (command==0x10) // read command
   {
     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET) {};
     Simple_delay_43ns((void*)10); // important delay (16) at SPI freq.=750kHz

     //Compulsory reads to DR and SR to clear OVR,
     //so that next incoming data is saved
     SPI_I2S_ReceiveData(SPI1);                     // To clear OVR
     SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE); // To clear OVR

     //Reading byte1
     SPI_I2S_SendData(SPI1, 0xFF);  // DUMMY WRITE
     // Wait until RX buffer is not empty, then read the received data
     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==0) {}

     Result_read = SPI_I2S_ReceiveData(SPI1); //  Read
    }

     // Reset to device SPIx
     GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
     //GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);
  return Result_read;
}


Send_24Bit_Opcode(0x90,1,0x55);//0x90 寫
err =  Send_24Bit_Opcode(0x10,1,0xff);//err = 0x55 0x10讀

讀不回0x55 每次都是0xFF。是代碼問題嗎?

2(1)(1).png (157.04 KB, 下載次數: 61)

2(1)(1).png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2022-10-11 18:41 來自手機 | 只看該作者
主機需要考慮從機的響應和處理速度。從機需要考慮在做任何處理時,都能停下手頭的工作,響應主機的要求。
回復

使用道具 舉報

板凳
ID:391219 發表于 2022-10-11 19:36 | 只看該作者
188610329 發表于 2022-10-11 18:41
主機需要考慮從機的響應和處理速度。從機需要考慮在做任何處理時,都能停下手頭的工作,響應主機的要求。

那您的意思是速度太快了嗎?可是有的時候,我再重新燒錄程序的時候,會全部復位在進行燒錄。有的時候能通信,有的時候就不行。要是因為速度的話,每次重新開始的時候,不應該時好時壞。
回復

使用道具 舉報

地板
ID:624769 發表于 2022-10-11 22:21 | 只看該作者
不是指 SPI 的傳輸速度 快慢,而是指  SPI  傳指令 給 從機, 從機 接受到 指令, 處理,準備數據 回傳給主機,這個過程需要時間的, 但是,時鐘是主機發出的,主機是不知道 從機 準備沒準備好的。 所以,這個指令的復雜程度,從機需要處理的時間, 主機這邊要有  充分的等待, 才能 發出時鐘 取數據。
同樣,主機發出 CE/SS  信號,然后發數據 給從機, 這個時候,從機在干什么?  你能不能確保,這個時候從機就 等在 SPI 線程上 等待指令接收完畢,立刻處理? 如果,這個時候,從機在處理別的事情,你又沒有機制,讓從機停止工作,來處理SPI 發來的指令? 這是  雙機通訊中必須考慮的問題。

因為,不知道你  雙機 SPI 通訊 具體進行什么 數據交互,就只能推測這些了。
回復

使用道具 舉報

5#
ID:123289 發表于 2022-10-12 08:27 | 只看該作者
你要保證,當你發送的時候,對方在收。
建議用中斷方式解決這個問題。
回復

使用道具 舉報

6#
ID:391219 發表于 2022-10-12 10:46 | 只看該作者
本帖最后由 1123qqw 于 2022-10-12 10:59 編輯
188610329 發表于 2022-10-11 22:21
不是指 SPI 的傳輸速度 快慢,而是指  SPI  傳指令 給 從機, 從機 接受到 指令, 處理,準備數據 回傳給主 ...

交換的數據為21位的浮點數。我怎么確保從機能收到呢?芯片手冊并沒有給如何設置,只是給了一個端口,設置為低電平就能啟動SPI通信。
回復

使用道具 舉報

7#
ID:391219 發表于 2022-10-12 10:58 | 只看該作者
yzwzfyz 發表于 2022-10-12 08:27
你要保證,當你發送的時候,對方在收!
建議用中斷方式解決這個問題。

從機是PCAP01芯片,說明手冊并沒有給我如何設置,只是給了一個啟動SPI的方式。
回復

使用道具 舉報

8#
ID:624769 發表于 2022-10-12 12:49 | 只看該作者
1123qqw 發表于 2022-10-12 10:46
交換的數據為21位的浮點數。我怎么確保從機能收到呢?芯片手冊并沒有給如何設置,只是給了一個端口,設置 ...

暈死,被帶溝里去了, 你說兩個芯片SPI通訊, 潛意識就認為 是兩個單片機了。弄了半天是 控制器件。

PCAP01 沒有用過,不清楚,不過SPI 操控器件, 時好時壞, 無非3個原因
1,線路沒接好,有干擾,器件的供電沒有,有效的濾波。(檢查線路,排除干擾,增加濾波電容,從你的原理圖上看,6腳這里應該添加 104電容)
2,主機的 SPI 驅動力不夠,距離較遠,1/0轉換不及時  (添加上拉電阻)
3,SPI 設定的傳輸速度過快,接近器件的極限值。(降低SPI的速度,測試時建議調到最慢速度。)

回復

使用道具 舉報

9#
ID:391219 發表于 2022-10-12 21:12 | 只看該作者
188610329 發表于 2022-10-12 12:49
暈死,被帶溝里去了, 你說兩個芯片SPI通訊, 潛意識就認為 是兩個單片機了。弄了半天是 控制器件。

P ...

我都在一個板上,距離很近。我將速度降低,設置為:SPI_BaudRatePrescaler_256。今天試了一天,還是連接不上,前兩天還好好的。現在將數值寫入,讀出來全是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);
       
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区成人 | 欧美成人性生活 | 青青草精品| 精品国产91乱码一区二区三区 | 久久久久久久久99 | 日韩免费福利视频 | 国产91 在线播放 | 精品美女在线观看 | 国产真实精品久久二三区 | 日韩欧美精品在线 | 91免费在线视频 | 国产精品一区二区三区在线 | 欧美成人一区二区三区片免费 | 国产高清免费在线 | 欧美一区二区久久 | av网站在线播放 | 日韩三级一区 | 免费一级黄色录像 | 男人天堂av网 | 国产一区91在线 | 欧美日韩国产精品一区二区 | 香蕉一区二区 | 日韩精品免费在线 | 精品欧美一区二区三区久久久 | 欧美一区在线视频 | 三级免费| 欧美日韩精品一区二区天天拍 | 亚洲成人中文字幕 | 欧美亚洲视频在线观看 | 日韩中文欧美 | 亚洲天天| 国产 日韩 欧美 制服 另类 | 国产精品久久久久久久久久东京 | 中文字幕一二三 | 亚洲免费精品一区 | 九九久久久久久 | 国产成人a亚洲精品 | 色婷婷综合网 | 精品中文字幕一区二区三区 | 蜜桃视频麻豆 | 视频一区二区在线观看 |