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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PIC18F4680單片機SPI和IIC可以分時復用嗎?

[復制鏈接]
跳轉到指定樓層
樓主
PIC18f4680  SPI和IIC同時使用,SPI 驅動字庫芯片,IIC驅動OLED。SPI和IIC都是使用的RC3 和RC4引腳,可以進行分時復用嗎?怎么實現? void main(void)
{
    unsigned char NixieNum =0 ,Temp1 = 0;
    GPIO_Init();
    Timer0_int();
    OLED_Init();
    OLED_Clear(0xf0);
    OLED_Clear(0x00);
    OLED_Clear(0x0F);
    OLED_Clear(0x00);
    OLED_ShowString(1,1,"KeyNum:");
    OLED_ShowString(2,1,"Nixie:");
    OLED_ShowString(3,1,"0x");
//    OLED_GB2312_15x16_ShowChar(4,1,"按鍵");
  while(1)
  {
      NixieNum = Key_NIXIE_Num();
      if(NixieNum)
      {
         Temp1 = NixieNum;
         OLED_ShowBinNum(2,8,Temp1,8 );
         OLED_ShowHexNum(3,3,Temp1,2);
         if(Temp1 == 0xDF){ LED_RGB_G_ON();}
         if(Temp1 == 0xEF){ LED_RGB_B_ON();}
         if(Temp1 == 0xF7){ LED_RGB_R_ON();}
         if(Temp1 == 0x5F){ LED_RGB_G_OFF();}
         if(Temp1 == 0x6F){ LED_RGB_B_OFF();}
         if(Temp1 == 0x77){ LED_RGB_R_OFF();}
      }

   }
}




void IIC_Init(void)
{
    LATCbits.LC0 = 1;             //SPI_CS_PIN          LATCbits.LC0(字庫片選)
    TRISCbits.RC0 = 0;             //CS  1:輸入   0:輸出(字庫片選)
    /*********************************
      **** 硬件IIC   GPIO初始化****
    *********************************/
    LATCbits.LC3 = 0;             //IIC_SCL
        LATCbits.LC4 = 0;             //IIC_SDA     

        TRISCbits.RC3 = 1;             //設置為輸入
        TRISCbits.RC4 = 1;             //設置為輸入
    SSPSTAT = 0x80;         //設置通訊速率100K;Disable SMBus
    SSPCON1 = 0x38;         //使能串口,主控模式,時鐘=Fosc/(4*(SSPADD+1)
    SSPCON2 = 0x00;         //
    PIR1bits.SSPIF=0;       //中斷標志清零
    SSPADD = 0x27;         // 頻率 = Focs/(4 * (SSPADD + 1))   ;100K頻率 16M晶振 SSPADD= 0x27;                        
}



void  SPI_Init(void)
{
     /*********************************
      **** SPI__GPIO初始化****
    *********************************/
    LATCbits.LC0 = 1;             //SPI_CS_PIN          LATCbits.LC0(字庫片選)
    LATCbits.LC2 = 1;             //SPI_CS_PIN          LATCbits.LC0(FLASH片選)
        LATCbits.LC3 = 0;             //SPI_SCK_PIN          LATCbits.LC3
        PORTCbits.RC4 = 0;            //SPI_MISO_PIN         PORTCbits.RC4       //數據輸入
        LATCbits.LC5 = 0;             //SPI_MOSI_PIN         LATCbits.LC5                //數據輸出

        TRISCbits.RC0 = 0;             //CS  1:輸入   0:輸出(字庫片選)
    TRISCbits.RC2 = 0;             //flash_CS  1:輸入   0:輸出(FLASH片選)
        TRISCbits.RC3 = 0;             //CLK 1:輸入   0:輸出
        TRISCbits.RC4 = 1;             //SDI 1:輸入   0:輸出               
        TRISCbits.RC5 = 0;             //SDO 設置RC5端口為輸出

    //SCLK開始高電平上升沿發送數據,下降沿接收數據。
     //0000 0000      
        SSPSTAT = 0x80;   //bit7 = 1; 0:在數據輸出時間的中間采樣輸入數據 1:在數據輸出時間的末端采樣輸入數據
                      //bit6 = 0; 0:時鐘狀態從空閑換到有效時發送     1:時鐘從有效換到空閑時發送
                      //bit0 = 0; 接收未完成,SSBUF空
        SSPCON1 = 0x32;    //bit5 = 1; 使能SPI, bit4 = 1;空閑狀態時,時鐘為高電平
                       //bit3-0 = 0010,SPI主控模式,時鐘=Fosc/64
//    SSPCON1bits.WCOL  = 0;          //寫沖突檢測 0:未發生沖突  1:
//    SSPCON1bits.CKP   = 1;          //bit4 = 1;空閑狀態時,時鐘為高電平
//    SSPCON1bits.SSPM3 = 0;          //bit3-0 = 0011,SPI主控模式,時鐘=TMR2輸出/2
//    SSPCON1bits.SSPM2 = 0;          //         0010,SPI主控模式,時鐘=Fosc/16
//    SSPCON1bits.SSPM1 = 1;          //         0001,SPI主控模式,時鐘=Fosc/16
//    SSPCON1bits.SSPM0 = 0;          //         0000,SPI主控模式,時鐘=Fosc/4

    SSPIF = 0;             //中斷標志位清零
    SSPCON1bits.SSPEN = 1;          //使能SPI

}


/**
  * @brief  OLED寫命令
  * @param  Command 要寫入的命令
  * @retval 無
  */
void oled_cmd(char cmd)
{
    IIC_Init();
    IIC_STAT();
    IIC_SendByte(0x78);
    IIC_SendByte(0x00);
    IIC_SendByte(cmd);
    IIC_STOP();
}
/**
  * @brief  OLED寫數據
  * @param  Data 要寫入的數據
  * @retval 無
  */
void oled_data(char Data)
{
    IIC_Init();
    IIC_STAT();
    IIC_SendByte(0x78);
    IIC_SendByte(0x40);
    IIC_SendByte(Data);
    IIC_STOP();
}


/**
  * @brief  OLED顯示漢字
  * @param  Line 行位置,范圍:1~4
  * @param  Column 列位置,范圍:1~16
  * @param  text 要顯示的一個字符,范圍:字庫芯片
  * @retval 無
  */
void OLED_GB2312_15x16_ShowChar(unsigned char Line, unsigned char Column, unsigned char *text)
{              
        unsigned char i,j;
        unsigned char SZHPArray[32];
        unsigned char HZHPArray[32];
        while(*text != 0)
        {
    //    SPI_Init();
                GT30L32S4W_Get_Bytes_GB2312_15x16(text,HZHPArray);
                GB2312_15x16_HengZhiHengPai_to_ShuZhiHengPai(SZHPArray,HZHPArray);
        //        IIC_Init();
                for(j = 0; j < 32; j ++)
                {
                        OLED_SetCursor((unsigned char)((Line - 1) * 2), (unsigned char)((Column - 1) * 8));                //設置光標位置在上半部分
                        for (i = 0; i < 16; i++)
                        {
                                oled_data(SZHPArray[ i]);                        //顯示上半部分內容
                        }
                        OLED_SetCursor((unsigned char)((Line - 1) * 2 + 1), (unsigned char)((Column - 1) * 8));        //設置光標位置在下半部分
                        for (i = 0; i < 16; i++)
                        {
                                oled_data(SZHPArray[i + 16]);                //顯示下半部分內容
                        }
                }
                text += 2;        //下個字
                Column += 2;
        }
}




IIC.png (1.31 MB, 下載次數: 71)

IIC初始化

IIC初始化

SPI1.png (1.18 MB, 下載次數: 71)

SPI

SPI

SPI2.png (1.18 MB, 下載次數: 69)

SPI

SPI

OLED.png (1.72 MB, 下載次數: 79)

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

使用道具 舉報

沙發
ID:1083396 發表于 2023-6-15 15:04 | 只看該作者
我應該在程序的什么地方進行分時復用?沒有思路
回復

使用道具 舉報

板凳
ID:155507 發表于 2023-6-15 19:25 | 只看該作者
對于PIC18F4680單片機來說,SPI和I2C(IIC)是兩種不同的串行通信協議,它們不能直接分時復用在同一個引腳上。

SPI(Serial Peripheral Interface)是一種同步的串行通信協議,需要使用SCK(時鐘)、SDI(數據輸入)、SDO(數據輸出)和SS(片選)等引腳進行通信。SPI通信是基于主從設備的方式進行的,主設備控制通信時序和數據傳輸。

I2C(Inter-Integrated Circuit,也稱為IIC)是一種雙線制串行通信協議,需要使用SCL(時鐘)和SDA(數據)等引腳進行通信。I2C通信是基于主從設備的方式進行的,主設備控制通信時序和數據傳輸。

由于SPI和I2C使用不同的通信方式和時序,它們不能直接在同一個引腳上進行分時復用。每個通信協議都需要專用的引腳來進行通信。

如果您需要同時使用SPI和I2C通信,您需要為每個通信協議分配不同的引腳,并根據需要進行引腳的連接和配置。

SPI 設備可以通過不聲明其從機選擇來忽略 SCK 和 SDI,但是 IIC 設備會被 SCL 和 SDA 線上的正常 SCK 和 SDI 信號弄糊涂。 即使粗略地看一下 IIC 規范也會發現這一點。

回復

使用道具 舉報

地板
ID:1083396 發表于 2023-6-16 10:25 | 只看該作者
angmall 發表于 2023-6-15 19:25
對于PIC18F4680單片機來說,SPI和I2C(IIC)是兩種...

"【解惑帖】I2C與SPI總線分時復用造成的沖突",這個帖子上說可以分時復用。我也認為是可以的只要在使用SPI時關閉IIC,在使用IIC時關閉SPI應該就能實現。我再研究研究。謝謝
回復

使用道具 舉報

5#
ID:123289 發表于 2023-6-16 11:32 | 只看該作者
你可以相像一下:
在時間1,將它配制成SPI,這一點CPU會無條件服從。
在時間2,再將它配制成I2C,這一點CPU也無法抗拒啊。
所以你的想法是成立的!
不過,你要想好,通訊的對方是否可以配合,以及外部分硬件是否能夠配合。
回復

使用道具 舉報

6#
ID:1083396 發表于 2023-6-16 11:58 | 只看該作者
yzwzfyz 發表于 2023-6-16 11:32
你可以相像一下:
在時間1,將它配制成SPI,這一點CPU會無條件服從。
在時間2,再將它配制成I2C,這一點C ...

對的理論上是這樣的。
現在是IIC驅動的OLED顯示沒有問題,SPI控制的字庫讀不出。

SPI控制的字庫,在片選選通之前,將通訊切換成SPI理論上應該可以。
我感覺是MSSP中的哪個寄存器沒有配置對。或者是配置的順序不對。
單獨測試SPI和IIC都是沒有問題的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av网址在线 | 亚洲天堂av网 | av中文字幕在线 | av一区二区三区 | 日韩一区二区三区四区五区六区 | 精品一二三区视频 | 久久亚洲国产精品 | 精品免费国产一区二区三区四区介绍 | 精品一区在线 | 天堂一区| 国产精品久久久久久吹潮 | 99国产精品久久久 | 亚洲在线免费观看 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 国产xxxx在线 | 亚洲国产精品一区二区三区 | 日韩视频精品 | 日韩视频在线免费观看 | 在线看亚洲| 亚洲精品久久 | 9191成人精品久久 | 国产精品美女久久久久aⅴ国产馆 | 久久国产成人 | 视频一二三区 | 久久综合九色综合欧美狠狠 | 福利视频一区 | 久久人人网 | 欧美激情久久久 | 每日在线更新av | 亚洲导航深夜福利涩涩屋 | 高清国产午夜精品久久久久久 | 国产欧美日韩视频 | 久久九九网站 | 91视频导航 | 国产激情精品一区二区三区 | 国产精品一区二区三区在线 | 亚洲国产午夜 | 一区二区三区播放 | 中文字幕日韩在线观看 | 国产精品免费视频一区 | 91美女在线观看 |