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

標題: PIC18F4680單片機SPI和IIC可以分時復用嗎? [打印本頁]

作者: b69350532    時間: 2023-6-15 15:00
標題: 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

作者: b69350532    時間: 2023-6-15 15:04
我應該在程序的什么地方進行分時復用?沒有思路
作者: angmall    時間: 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 規范也會發現這一點。


作者: b69350532    時間: 2023-6-16 10:25
angmall 發表于 2023-6-15 19:25
對于PIC18F4680單片機來說,SPI和I2C(IIC)是兩種...

"【解惑帖】I2C與SPI總線分時復用造成的沖突",這個帖子上說可以分時復用。我也認為是可以的只要在使用SPI時關閉IIC,在使用IIC時關閉SPI應該就能實現。我再研究研究。謝謝
作者: yzwzfyz    時間: 2023-6-16 11:32
你可以相像一下:
在時間1,將它配制成SPI,這一點CPU會無條件服從。
在時間2,再將它配制成I2C,這一點CPU也無法抗拒啊。
所以你的想法是成立的!
不過,你要想好,通訊的對方是否可以配合,以及外部分硬件是否能夠配合。
作者: b69350532    時間: 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都是沒有問題的





歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美精品99久久久 | 又黄又爽又刺激的视频 | 成人理论影院 | 久草福利| 日本久久久久 | 中文字幕+乱码+中文乱码91 | 三级免费观看 | 亚洲免费小视频 | 成人免费看 | 亚洲激情视频在线 | 久久精品中文 | 国产亚洲精品成人av久久ww | 午夜精品999| 亚洲免费播放 | 国产精品观看 | 你懂的在线网站 | 可以看的毛片 | 亚洲午夜精品一区二区三区 | 亚洲二区在线 | 日本黄色三级视频 | 少妇一级毛片 | 四虎海外| 天天爽夜夜爽夜夜爽精品视频 | 国产69精品久久久久久 | 日本在线| 伊人国产女| 91玖玖| 亚洲综合日韩 | 91蝌蚪91九色白浆 | 国产精品久久一区 | 九九影视理伦片 | 夜色在线影院 | 黄色成年人网站 | 成人欧美激情 | 中文字幕国产 | 国产激情久久久 | 亚洲激情在线 | 午夜看片| 精品在线一区 | 福利影视| 在线观看视频国产 |