CH582 模擬II程序 低速程序發(fā)我一下

我接了個(gè)項(xiàng)目溫濕度傳感器(DHT20型號(hào))要導(dǎo)線80CM線長(zhǎng)IIC通訊 普通程序通訊有干擾。

希望沁恒微給我一個(gè)低速4k通訊速率程序,模擬的程序發(fā)我謝謝了。

icon_pdf.gifdht20產(chǎn)品規(guī)格書(shū)(中文版) a2.pdf

郵箱個(gè)人信息保護(hù),已隱藏

IIC通訊 4K速率 再慢一點(diǎn)也行 發(fā)我程序哦? 謝謝

一定要發(fā)我哦。

搞好給你100塊買(mǎi)咖啡喝j_0002.gifj_0001.gif


你們這個(gè)IO確實(shí)不好操作 請(qǐng)賜教 iic



51 iic 程序我移植不了哦?? 操作不一樣哦


網(wǎng)上一搜一大把, 這都不會(huì)移植, 兄弟別干嵌入式了吧

https://blog.csdn.net/m0_59601101/article/details/125310818


這傻逼IIC是板內(nèi)通信,飛線搞能不干擾才怪


#ifdefIS_7P

// #include "nvs.h"

// #include "nvs_flash.h"

#defineCLK_PINGPIO_Pin_12

#defineDATA_PINGPIO_Pin_13

#defineMCU_HAVE_DATAGPIOB_ReadPortPin(DATA_PIN)


void Delay_N10us(uint32_tt)//延時(shí)函數(shù)

{

? ? // volatile uint32_t k;

? ? // while (t--)

? ? // {

? ? // ? ? for (k = 0; k < 2; k++)//110

? ? // ? ? ? ? ;

? ? // }

}


void SensorDelay_us(uint32_tt)//延時(shí)函數(shù)

{

? ? mDelayuS(t);

? ? // t = t - 2;

? ? // for (; t > 0; t--)

? ? // {

? ? // ? ? Delay_N10us(1);

? ? // }

}


void Delay_3us(void)//延時(shí)函數(shù)

{

? ? mDelayuS(3);

? ? // Delay_N10us(1);

? ? // Delay_N10us(1);

? ? // Delay_N10us(1);

? ? // Delay_N10us(1);

}

void Delay_1us(void)//延時(shí)函數(shù)

{

? ? mDelayuS(1);

? ? // Delay_N10us(1);

? ? // Delay_N10us(1);

? ? // Delay_N10us(1);

? ? // Delay_N10us(1);

? ? // Delay_N10us(1);

}


void SDA_Pin_Output_High(void)//將P15配置為輸出 , 并設(shè)置為低電平, P15作為I2C的SDA

{

? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeOut_PP_5mA);

? ? GPIOB_SetBits(DATA_PIN);

? ? // gpio_pad_select_gpio(DATA_PIN);

? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_OUTPUT);

? ? // gpio_set_level(DATA_PIN, 1);

? ? // ?Gpio_InitIOExt(1,5,GpioDirOut,TRUE, FALSE, TRUE, FALSE);//config P15 to output

? ? // ?Gpio_SetIO(1,5,1);

}


void SDA_Pin_Output_Low(void)//將P15配置為輸出 ?并設(shè)置為高電平

{

? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeOut_PP_5mA);

? ? GPIOB_ResetBits(DATA_PIN);


? ? // gpio_pad_select_gpio(DATA_PIN);

? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_OUTPUT);

? ? // gpio_set_level(DATA_PIN, 0);


? ? // ?Gpio_InitIOExt(1,5,GpioDirOut,TRUE, FALSE, TRUE, FALSE);//config P15 to output

? ? // ?Gpio_SetIO(1,5,0);

}


void SDA_Pin_IN_FLOATING(void)// SDA配置為懸浮輸入

{

? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeIN_Floating);

? ? // gpio_pad_select_gpio(DATA_PIN);

? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_INPUT);

? ? // gpio_set_pull_mode(DATA_PIN, GPIO_PULLUP_ONLY);


? ? // ? Gpio_InitIO(1, 5, GpioDirIn);

}


void SCL_Pin_Output_High(void)// SCL輸出高電平,P14作為I2C的SCL

{

? ? GPIOB_SetBits(CLK_PIN);


? ? // gpio_set_level(CLK_PIN, 1);

}


void SCL_Pin_Output_Low(void)// SCL輸出低電平

{

? ? GPIOB_ResetBits(CLK_PIN);

? ? // gpio_set_level(CLK_PIN, 0);

}


void Init_I2C_Sensor_Port(void)//初始化I2C接口

{

? ? GPIOB_ModeCfg(CLK_PIN,GPIO_ModeOut_PP_5mA);

? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeOut_PP_5mA);

? ? GPIOB_SetBits(CLK_PIN);

? ? GPIOB_SetBits(DATA_PIN);

? ? // gpio_pad_select_gpio(DATA_PIN);

? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_OUTPUT);

? ? // gpio_set_level(DATA_PIN, 1);

? ? // gpio_pad_select_gpio(CLK_PIN);

? ? // gpio_set_direction(CLK_PIN, GPIO_MODE_OUTPUT);

? ? // gpio_set_level(CLK_PIN, 1);

}


void I2C_Start(void)// I2C主機(jī)發(fā)送START信號(hào)

{

? ? SDA_Pin_Output_High();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_High();

? ? SensorDelay_us(8);

? ? SDA_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_Low();

? ? SensorDelay_us(8);

}


void ZSSC_I2C_WR_Byte(uint8_tByte)//往AHT10寫(xiě)一個(gè)字節(jié)

{

? ? uint8_tData,N,i;

? ? Data=Byte;

? ? i=0x80;

? ? for (N=0;N<8;N++)

? ? {

? ? ? ? SCL_Pin_Output_Low();


? ? ? ? Delay_3us();


? ? ? ? if (i&Data)

? ? ? ? {

? ? ? ? ? ? SDA_Pin_Output_High();

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? SDA_Pin_Output_Low();

? ? ? ? }


? ? ? ? SCL_Pin_Output_High();

? ? ? ? Delay_3us();


? ? ? ? Data<<=1;

? ? }

? ? SCL_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SDA_Pin_IN_FLOATING();

? ? SensorDelay_us(8);

}


uint8_t ZSSC_I2C_RD_Byte(void)//從AHT10讀取一個(gè)字節(jié)

{

? ? uint8_tByte,i,a;

? ? Byte=0;

? ? SCL_Pin_Output_Low();

? ? SDA_Pin_IN_FLOATING();

? ? SensorDelay_us(8);

? ? for (i=0;i<8;i++)

? ? {

? ? ? ? SCL_Pin_Output_High();

? ? ? ? Delay_1us();

? ? ? ? a=0;

? ? ? ? if (MCU_HAVE_DATA)

? ? ? ? ? ? a=1;

? ? ? ? Byte= (Byte<<1) |a;

? ? ? ? SCL_Pin_Output_Low();

? ? ? ? Delay_1us();

? ? }

? ? SDA_Pin_IN_FLOATING();

? ? SensorDelay_us(8);

? ? returnByte;

}


uint8_t Receive_ACK(void)//看AHT20是否有回復(fù)ACK

{

? ? uint16_tCNT;

? ? CNT=0;

? ? SCL_Pin_Output_Low();

? ? SDA_Pin_IN_FLOATING();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_High();

? ? SensorDelay_us(8);

? ? while ((MCU_HAVE_DATA) &&CNT<100)

? ? ? ? CNT++;

? ? if (CNT==100)

? ? {

? ? ? ? return0;

? ? }

? ? SCL_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? return1;

}


void Send_ACK(void)//主機(jī)回復(fù)ACK信號(hào)

{

? ? SCL_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SDA_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_High();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SDA_Pin_IN_FLOATING();

? ? SensorDelay_us(8);

}


void Send_NOT_ACK(void)//主機(jī)不回復(fù)ACK

{

? ? SCL_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SDA_Pin_Output_High();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_High();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SDA_Pin_Output_Low();

? ? SensorDelay_us(8);

}


void Stop_I2C(void)//一條協(xié)議結(jié)束

{

? ? SDA_Pin_Output_Low();

? ? SensorDelay_us(8);

? ? SCL_Pin_Output_High();

? ? SensorDelay_us(8);

? ? SDA_Pin_Output_High();

? ? SensorDelay_us(8);

}


uint8_t JH_Read_Status(void)//讀取AHT10的狀態(tài)寄存器

{

? ? uint8_tByte_first;

? ? I2C_Start();

? ? ZSSC_I2C_WR_Byte(0x71);

? ? Receive_ACK();

? ? Byte_first=ZSSC_I2C_RD_Byte();

? ? Send_NOT_ACK();

? ? Stop_I2C();

? ? // printf("\n變量Byte_first = %d\n",Byte_first);

? ? returnByte_first;

}


uint8_t JH_Read_Cal_Enable(void)//查詢(xún)cal enable位有沒(méi)有使能?

{

? ? uint8_tval=0;// ret = 0,


? ? val=JH_Read_Status();

? ? if ((val&0x68) ==0x08)

? ? ? ? return1;

? ? else

? ? ? ? return0;

}


void JH_SendAC(void)//向AHT10發(fā)送AC命令

{


? ? I2C_Start();

? ? ZSSC_I2C_WR_Byte(0x70);

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0xac);// 0xAC采集命令

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0x33);

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0x00);

? ? Receive_ACK();

? ? Stop_I2C();

}


// CRC校驗(yàn)類(lèi)型:CRC8/MAXIM

//多項(xiàng)式:X8+X5+X4+1

// Poly:0011 0001 ?0x31

//高位放到后面就變成 1000 1100 0x8c

// C現(xiàn)實(shí)代碼:

uint8_t Calc_CRC8(uint8_t*message,uint8_tNum)

{

? ? uint8_ti;

? ? uint8_tbyte;

? ? uint8_tcrc=0xFF;

? ? for (byte=0;byte<Num;byte++)

? ? {

? ? ? ? crc^= (message[byte]);

? ? ? ? for (i=8;i>0;--i)

? ? ? ? {

? ? ? ? ? ? if (crc&0x80)

? ? ? ? ? ? ? ? crc= (crc<<1) ^0x31;

? ? ? ? ? ? else

? ? ? ? ? ? ? ? crc= (crc<<1);

? ? ? ? }

? ? }

? ? returncrc;

}


bool JH_Read_CTdata(uint32_t*ct)//沒(méi)有CRC校驗(yàn),直接讀取AHT10的溫度和濕度數(shù)據(jù)

{

? ? // ? ?volatile uint8_t ?Byte_1th = 0;

? ? volatileuint8_tByte_2th=0;

? ? volatileuint8_tByte_3th=0;

? ? volatileuint8_tByte_4th=0;

? ? volatileuint8_tByte_5th=0;

? ? volatileuint8_tByte_6th=0;

? ? uint32_tRetuData=0;

? ? uint16_tcnt=0;

? ? staticboolonce=false;

? ? if (once==false)

? ? {

? ? ? ? once=true;

? ? ? ? JH_SendAC();//向AHT10發(fā)送AC命令

? ? ? ? returnfalse;

? ? }

? ? else

? ? {

? ? ? ? once=false;

? ? ? ? // mDelaymS(80); ? ?//大約延時(shí)80ms

? ? ? ? cnt=0;

? ? ? ? while (((JH_Read_Status()&0x80) ==0x80))//直到狀態(tài)bit[7]為0,表示為空閑狀態(tài),若為1,表示忙狀態(tài)

? ? ? ? {

? ? ? ? ? ? mDelaymS(1);

? ? ? ? ? ? // vTaskDelay(10 / portTICK_RATE_MS);

? ? ? ? ? ? // ? ? ? ?SensorDelay_us(1508);

? ? ? ? ? ? if (cnt++>=100)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? I2C_Start();


? ? ? ? ZSSC_I2C_WR_Byte(0x71);

? ? ? ? Receive_ACK();

? ? ? ? // ? ?Byte_1th =

? ? ? ? ZSSC_I2C_RD_Byte();//狀態(tài)字

? ? ? ? Send_ACK();

? ? ? ? Byte_2th=ZSSC_I2C_RD_Byte();//濕度

? ? ? ? Send_ACK();

? ? ? ? Byte_3th=ZSSC_I2C_RD_Byte();//濕度

? ? ? ? Send_ACK();

? ? ? ? Byte_4th=ZSSC_I2C_RD_Byte();//濕度/溫度

? ? ? ? Send_ACK();

? ? ? ? Byte_5th=ZSSC_I2C_RD_Byte();//溫度

? ? ? ? Send_ACK();

? ? ? ? Byte_6th=ZSSC_I2C_RD_Byte();//溫度

? ? ? ? Send_NOT_ACK();

? ? ? ? Stop_I2C();


? ? ? ? RetuData= (RetuData|Byte_2th) <<8;

? ? ? ? RetuData= (RetuData|Byte_3th) <<8;

? ? ? ? RetuData= (RetuData|Byte_4th);

? ? ? ? RetuData=RetuData>>4;

? ? ? ? ct[0] =RetuData;//濕度

? ? ? ? RetuData=0;

? ? ? ? RetuData= (RetuData|Byte_4th) <<8;

? ? ? ? RetuData= (RetuData|Byte_5th) <<8;

? ? ? ? RetuData= (RetuData|Byte_6th);

? ? ? ? RetuData=RetuData&0xfffff;

? ? ? ? ct[1] =RetuData;//溫度

? ? ? ? returntrue;

? ? }

}


// void JH_Read_CTdata_crc(uint32_t *ct) // CRC校驗(yàn)后,讀取AHT10的溫度和濕度數(shù)據(jù)

// {

// ? ? volatile uint8_t Byte_1th = 0;

// ? ? volatile uint8_t Byte_2th = 0;

// ? ? volatile uint8_t Byte_3th = 0;

// ? ? volatile uint8_t Byte_4th = 0;

// ? ? volatile uint8_t Byte_5th = 0;

// ? ? volatile uint8_t Byte_6th = 0;

// ? ? volatile uint8_t Byte_7th = 0;

// ? ? uint32_t RetuData = 0;

// ? ? uint16_t cnt = 0;

// ? ? // uint8_t ?CRCDATA=0;

// ? ? uint8_t CTDATA[6] = {0}; //用于CRC傳遞數(shù)組


// ? ? JH_SendAC(); //向AHT10發(fā)送AC命令

// ? ? vTaskDelay(100 / portTICK_RATE_MS);

// ? ? // ? ?SensorDelay_us(80000); //大約延時(shí)80ms

// ? ? cnt = 0;


// ? ? while (((JH_Read_Status() & 0x80) == 0x80)) //直到狀態(tài)bit[7]為0,表示為空閑狀態(tài),若為1,表示忙狀態(tài)

// ? ? {

// ? ? ? ? vTaskDelay(10 / portTICK_RATE_MS);

// ? ? ? ? // ? ? ? ?SensorDelay_us(1508);

// ? ? ? ? if (cnt++ >= 100)

// ? ? ? ? {

// ? ? ? ? ? ? break;

// ? ? ? ? }

// ? ? }


// ? ? I2C_Start();


// ? ? ZSSC_I2C_WR_Byte(0x71);

// ? ? Receive_ACK();

// ? ? CTDATA[0] = Byte_1th = ZSSC_I2C_RD_Byte(); //狀態(tài)字

// ? ? Send_ACK();

// ? ? CTDATA[1] = Byte_2th = ZSSC_I2C_RD_Byte(); //濕度

// ? ? Send_ACK();

// ? ? CTDATA[2] = Byte_3th = ZSSC_I2C_RD_Byte(); //濕度

// ? ? Send_ACK();

// ? ? CTDATA[3] = Byte_4th = ZSSC_I2C_RD_Byte(); //濕度/溫度

// ? ? Send_ACK();

// ? ? CTDATA[4] = Byte_5th = ZSSC_I2C_RD_Byte(); //溫度

// ? ? Send_ACK();

// ? ? CTDATA[5] = Byte_6th = ZSSC_I2C_RD_Byte(); //溫度

// ? ? Send_ACK();

// ? ? Byte_7th = ZSSC_I2C_RD_Byte(); // CRC數(shù)據(jù)

// ? ? Send_NOT_ACK();

// ? ? Stop_I2C();


// ? ? if (Calc_CRC8(CTDATA, 6) == Byte_7th)

// ? ? {

// ? ? ? ? RetuData = (RetuData | Byte_2th) << 8;

// ? ? ? ? RetuData = (RetuData | Byte_3th) << 8;

// ? ? ? ? RetuData = (RetuData | Byte_4th);

// ? ? ? ? RetuData = RetuData >> 4;

// ? ? ? ? ct[0] = RetuData; //濕度

// ? ? ? ? RetuData = 0;

// ? ? ? ? RetuData = (RetuData | Byte_4th) << 8;

// ? ? ? ? RetuData = (RetuData | Byte_5th) << 8;

// ? ? ? ? RetuData = (RetuData | Byte_6th);

// ? ? ? ? RetuData = RetuData & 0xfffff;

// ? ? ? ? ct[1] = RetuData; //溫度

// ? ? ? ? ? ? ? ? ? ? ? ? ? // ? ? ? ?LED_GUZHANG_0();

// ? ? }

// ? ? else

// ? ? {

// ? ? ? ? ct[0] = 0x00;

// ? ? ? ? ct[1] = 0x00; //校驗(yàn)錯(cuò)誤返回00

// ? ? } ? ? ? ? ? ? ? ? // CRC數(shù)據(jù)

// }


void JH_Init(void)//初始化AHT10

{

? ? Init_I2C_Sensor_Port();

? ? I2C_Start();

? ? ZSSC_I2C_WR_Byte(0x70);

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0xa8);// 0xA8進(jìn)入NOR工作模式

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0x00);

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0x00);

? ? Receive_ACK();

? ? Stop_I2C();


? ? SensorDelay_us(11038);//延時(shí)10ms左右


? ? I2C_Start();

? ? ZSSC_I2C_WR_Byte(0x70);

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0xbe);// 0xBE初始化命令,AHT20的初始化命令是0xBE, ? AHT10的初始化命令是0xE1

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0x08);//相關(guān)寄存器bit[3]置1,為校準(zhǔn)輸出

? ? Receive_ACK();

? ? ZSSC_I2C_WR_Byte(0x00);

? ? Receive_ACK();

? ? Stop_I2C();

}

float tps = 0, humidity = 0;


void aht20_read()

{

? ? // ?int i = 0;

? ? volatileintc1,t1;

? ? uint32_tCT_data[2];

? ? staticbooljust_once=false;

? ? if (just_once==false)

? ? {

? ? ? ? just_once=true;

? ? ? ? Init_I2C_Sensor_Port();

? ? ? ? mDelaymS(40);

? ? ? ? // vTaskDelay(500 / portTICK_RATE_MS);//剛上電,延時(shí)40ms才可以讀取狀態(tài)

? ? ? ? if (!((JH_Read_Status()&0x0C) ==

? ? ? ? ? ? ? 0x0C))//首先讀取狀態(tài)字bit[3:2],如果=1,為校準(zhǔn)輸出,無(wú)須初始化;正常情況下讀回來(lái)的狀態(tài)是1C,忙狀態(tài)是讀回來(lái)是0x80,其他狀態(tài)都是異常狀態(tài)

? ? ? ? {

? ? ? ? ? ? JH_Init();//初始化

? ? ? ? }

? ? ? ? mDelaymS(500);

? ? }

? ? // vTaskDelay(500 / portTICK_RATE_MS);

? ? // AHT20初始化完成后等待500mS后去讀狀態(tài)字status,需要等待狀態(tài)字status的Bit[3]=1時(shí)才去讀數(shù)據(jù)。如果Bit[3]不等于1 ,發(fā)軟件復(fù)位0xBA給AHT10,再重新初始化AHT20,直至Bit[3]=1

? ? // while (1)

? ? {

? ? ? ? if (JH_Read_CTdata(

? ? ? ? ? ? ? ? CT_data))

? ? ? ? {

? ? ? ? ? ? c1=CT_data[0] *1000/1024/1024; ? ? ? ? ? //計(jì)算得到濕度值(放大了10倍)

? ? ? ? ? ? t1=CT_data[1] *200*10/1024/1024-500;//計(jì)算得到溫度值(放大了10倍)

? ? ? ? ? ? tps=t1/10.0f;

? ? ? ? ? ? humidity=c1/10.0f;

? ? ? ? }

? ? }

? ? return;

}


void AHT20_date_to_ble(char*send_buf,intlen)

{

? ? staticinti=0;

? ? memset(send_buf,0,len);

? ? snprintf(send_buf,len,"TPS%d@HUM%d@", (int)tps, (int)humidity);

}


#endif


溫濕度的版本給你參考下


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频