![]() |
我正在用的SHT30程序,模擬時序: void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //============================================================================= RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_1|GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_InitStructure); /* SCL_1; SDA1_1; SCL_0; SDA1_0; SCL_1; SDA1_1; IIC_SCL_1; IIC_SCL_0; IIC_SCL_1; IIC_SCL_0; IIC_SDA1_1; IIC_SDA1_0; IIC_SDA1_1; IIC_SDA1_0; IIC_SDA1_1; IIC_SDA1_0; IIC_SDA1_1; IIC_SDA1_0; IIC_SDA2_1; IIC_SDA2_0; IIC_SDA2_1; IIC_SDA2_0; IIC_SDA3_1; IIC_SDA3_0; IIC_SDA3_1; IIC_SDA3_0; IIC_SDA4_1; IIC_SDA4_0; IIC_SDA4_1; IIC_SDA4_0; */ } /*********************************************** 調用方式:void I2Cstart(void) ************************************************/ void I2CStart1(void) { SDA1_1; SCL_1; Delay_Nus(N1); SDA1_0; Delay_Nus(N1); SCL_0; } void I2CStart2(void) { SDA2_1; SCL_1; Delay_Nus(N1); SDA2_0; Delay_Nus(N1); SCL_0; } void I2CStart3(void) { SDA3_1; SCL_1; Delay_Nus(N1); SDA3_0; Delay_Nus(N1); SCL_0; } void I2CStart4(void) { SDA4_1; SCL_1; Delay_Nus(N1); SDA4_0; Delay_Nus(N1); SCL_0; } /*********************************************** 停止:void I2CStop(void) ************************************************/ void I2CStop1(void) { SCL_0; SDA1_0; Delay_Nus(N1); SCL_1; Delay_Nus(N2); SDA1_1;//stop Delay_Nus(N1); } void I2CStop2(void) { SCL_0; SDA2_0; Delay_Nus(N1); SCL_1; Delay_Nus(N2); SDA2_1;//stop Delay_Nus(N1); } void I2CStop3(void) { SCL_0; SDA3_0; Delay_Nus(N1); SCL_1; Delay_Nus(N2); SDA3_1;//stop Delay_Nus(N1); } void I2CStop4(void) { SCL_0; SDA4_0; Delay_Nus(N1); SCL_1; Delay_Nus(N2); SDA4_1;//stop Delay_Nus(N1); } /*********************************************** 應答:void SendAck(void) 主器件為接收方,從器件為發送方,應答信號 ************************************************/ void SendAck1(void) { SCL_0; SDA1_0;//低電平表示應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } void SendAck2(void) { SCL_0; SDA2_0;//低電平表示應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } void SendAck3(void) { SCL_0; SDA3_0;//低電平表示應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } void SendAck4(void) { SCL_0; SDA4_0;//低電平表示應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } /*********************************************** 非應答:void SendNotAck(void) 主器件為接收方,從器件為發送方 ************************************************/ void SendNotAck1(void) { SCL_0; SDA1_1;//高電平表示非應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } void SendNotAck2(void) { SCL_0; SDA2_1;//高電平表示非應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } void SendNotAck3(void) { SCL_0; SDA3_1;//高電平表示非應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } void SendNotAck4(void) { SCL_0; SDA4_1;//高電平表示非應答 Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; } /*********************************************** 等待應答?unsigned char WaitAck(void) 等待從器件接收方的應答 ************************************************/ unsigned char WaitAck1(void) { unsigned char errtime=255;//因故障接收方無ACK,超時值為255 SDA1_1;//SDA,SCL均高,釋放數據線準備接收應答 SCL_1; Delay_Nus(N1); //切換為輸入 // {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=(u32)8<<20;}//利用上拉此行可省略 while(GPIOA->IDR&PIN_SDA1)//判斷從設備輸出SDA是否為1, { errtime--; if(!errtime){I2CStop1();SystemError=0x11;return 0;} } SCL_0;Delay_Nus(N1); return 1; } unsigned char WaitAck2(void) { unsigned char errtime=255;//因故障接收方無ACK,超時值為255 SDA2_1;//SDA,SCL均高,釋放數據線準備接收應答 SCL_1; Delay_Nus(N1); //切換為輸入 // {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=(u32)8<<20;}//利用上拉此行可省略 while(GPIOA->IDR&PIN_SDA2)//判斷從設備輸出SDA是否為1, { errtime--; if(!errtime){I2CStop2();SystemError=0x11;return 0;} } SCL_0;Delay_Nus(N1); return 1; } unsigned char WaitAck3(void) { unsigned char errtime=255;//因故障接收方無ACK,超時值為255 SDA3_1;//SDA,SCL均高,釋放數據線準備接收應答 SCL_1; Delay_Nus(N1); //切換為輸入 // {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=(u32)8<<20;}//利用上拉此行可省略 while(GPIOA->IDR&PIN_SDA3)//判斷從設備輸出SDA是否為1, { errtime--; if(!errtime){I2CStop3();SystemError=0x11;return 0;} } SCL_0;Delay_Nus(N1); return 1; } unsigned char WaitAck4(void) { unsigned char errtime=255;//因故障接收方無ACK,超時值為255 SDA4_1;//SDA,SCL均高,釋放數據線準備接收應答 SCL_1; Delay_Nus(N1); //切換為輸入 // {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=(u32)8<<20;}//利用上拉此行可省略 while(GPIOA->IDR&PIN_SDA4)//判斷從設備輸出SDA是否為1, { errtime--; if(!errtime){I2CStop4();SystemError=0x11;return 0;} } SCL_0;Delay_Nus(N1); return 1; } /*********************************************** 發送字節:void I2CSendByte(unsigned char ch) 發送一個字節 ************************************************/ void I2CSendByte1(unsigned char ch) { unsigned char i=8; while(i--) { if((ch&0x80)==0x80){SDA1_1;}//字節的最高位為1,SDA=1,否則SDA=0 else{SDA1_0;} ch<<=1; Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; Delay_Nus(N1); } } void I2CSendByte2(unsigned char ch) { unsigned char i=8; while(i--) { if((ch&0x80)==0x80){SDA2_1;}//字節的最高位為1,SDA=1,否則SDA=0 else{SDA2_0;} ch<<=1; Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; Delay_Nus(N1); } } void I2CSendByte3(unsigned char ch) { unsigned char i=8; while(i--) { if((ch&0x80)==0x80){SDA3_1;}//字節的最高位為1,SDA=1,否則SDA=0 else{SDA3_0;} ch<<=1; Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; Delay_Nus(N1); } } void I2CSendByte4(unsigned char ch) { unsigned char i=8; while(i--) { if((ch&0x80)==0x80){SDA4_1;}//字節的最高位為1,SDA=1,否則SDA=0 else{SDA4_0;} ch<<=1; Delay_Nus(N1); SCL_1; Delay_Nus(N1); SCL_0; Delay_Nus(N1); } } /*********************************************** 接收字節:Byte I2CReceieveByte(void) 接收一個字節 ************************************************/ unsigned char I2CReceieveByte1(void) { unsigned char i=8; unsigned char ddata=0; SDA1_1; while(i--) { ddata<<=1; SCL_0; Delay_Nus(N1);//等待從器件送出數據 SCL_1; Delay_Nus(N1); //切換為輸入 if(READ_SDA1)ddata++;//非0, Delay_Nus(N1); } return ddata; } unsigned char I2CReceieveByte2(void) { unsigned char i=8; unsigned char ddata=0; SDA2_1; while(i--) { ddata<<=1; SCL_0; Delay_Nus(N1);//等待從器件送出數據 SCL_1; Delay_Nus(N1); //切換為輸入 if(READ_SDA2)ddata++;//非0, Delay_Nus(N1); } return ddata; } unsigned char I2CReceieveByte3(void) { unsigned char i=8; unsigned char ddata=0; SDA3_1; while(i--) { ddata<<=1; SCL_0; Delay_Nus(N1);//等待從器件送出數據 SCL_1; Delay_Nus(N1); //切換為輸入 if(READ_SDA3)ddata++;//非0, Delay_Nus(N1); } return ddata; } unsigned char I2CReceieveByte4(void) { unsigned char i=8; unsigned char ddata=0; SDA4_1; while(i--) { ddata<<=1; SCL_0; Delay_Nus(N1);//等待從器件送出數據 SCL_1; Delay_Nus(N1); //切換為輸入 if(READ_SDA4)ddata++;//非0, Delay_Nus(N1); } return ddata; } // void SHT_INI(void) { I2CStart1(); I2CSendByte1(0x88);//器件的寫地址 Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x20);// Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x2F);// Delay_Nus(N2); WaitAck1(); } void SHT_SoftReset(void) { I2CStart1(); I2CSendByte1(0x88);//器件的寫地址 Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x30);// Delay_Nus(N2); WaitAck1(); I2CSendByte1(0xA2);// Delay_Nus(N2); WaitAck1(); I2CStop1();} void SHT_Heat(void) { I2CStart1(); I2CSendByte1(0x88);//器件的寫地址 Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x30);// Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x6D);// Delay_Nus(N2); WaitAck1(); I2CStop1(); } void SHT_DisHeat(void) { I2CStart1(); I2CSendByte1(0x88);//器件的寫地址 Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x30);// Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x66);// Delay_Nus(N2); WaitAck1(); I2CStop1(); } void ReadSHT1(unsigned char ad,unsigned char count,unsigned char *buff) { unsigned char i; I2CStart1(); I2CSendByte1(0x88);//器件的寫地址 Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x2C);// Delay_Nus(N2); WaitAck1(); I2CSendByte1(0x06);// Delay_Nus(N2); WaitAck1(); I2CStart1(); I2CSendByte1(0x89);//器件的讀地址 Delay_Nus(N2); WaitAck1(); SCL_1;//釋放SCL //切換為輸入 //{GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=(u32)8<<20;}//利用上拉此行可省略 while((GPIOA->IDR&PIN_SCL)==0)//等待轉換完畢 { ; } I2CStart1(); I2CSendByte1(0x89);//器件的讀地址 Delay_Nus(N2); WaitAck1(); for(i=0;i<count;i++)//連續讀取count個數值 { buff[i]=I2CReceieveByte1(); if(i!=count-1)SendAck1();//除非最后一個字節,其它都要從MASTER發應答 } SendNotAck1(); I2CStop1(); } |
樓主,啥問題? |
wooooooo 發表于 2018-6-20 10:06 什么意思,請問我這個是程序的問題還是硬件的問題啊,謝謝 |
因CPU連接的外圍器件較多,一般放在中心區域,外圍器件根據與CPU的連接關系而確定布局位置。原則是連線最短、過孔最少 |