日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bq4050读固件_stm32f767 实现模拟SMBUS驱动bq4050

發(fā)布時(shí)間:2025/3/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bq4050读固件_stm32f767 实现模拟SMBUS驱动bq4050 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

#define SDA_IN() {GPIOB->MODER&=~(3<MODER|=0<<7*2;} //PB7輸入模式

#define SDA_OUT() {GPIOB->MODER&=~(3<MODER|=1<<7*2;} //PB7輸出模式

//IO操作

#define IIC_SCL(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)) //SCL

#define IIC_SDA(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET)) //SDA

#define READ_SDA HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)    //輸入SDA

//IIC初始化

void IIC_Init(void)

{

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOH時(shí)鐘

GPIO_Initure.Pin = GPIO_PIN_6|GPIO_PIN_7;

GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //推挽輸出

GPIO_Initure.Pull = GPIO_PULLUP; //上拉

GPIO_Initure.Speed = GPIO_SPEED_HIGH; //快速

HAL_GPIO_Init(GPIOB, &GPIO_Initure);

IIC_SDA(1);

IIC_SCL(1);

}

//產(chǎn)生IIC起始信號(hào)

void IIC_Start(void)

{

SDA_OUT(); //sda線輸出

IIC_SCL(0);

hrt_delay_us(2);

IIC_SDA(1);

hrt_delay_us(1);

IIC_SCL(1);

hrt_delay_us(9);

IIC_SDA(0);

hrt_delay_us(9);

IIC_SCL(0);//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)

}

//產(chǎn)生IIC停止信號(hào)

void IIC_Stop(void)

{

SDA_OUT(); //sda線輸出

IIC_SCL(0);

hrt_delay_us(1);

IIC_SDA(0); //STOP:when CLK is high DATA change form low to high

hrt_delay_us(9);

IIC_SCL(1);

hrt_delay_us(9);

IIC_SDA(1);//發(fā)送I2C總線結(jié)束信號(hào)

hrt_delay_us(9);

}

//等待應(yīng)答信號(hào)到來(lái)

//返回值:1,接收應(yīng)答失敗

// 0,接收應(yīng)答成功

uint8 IIC_Wait_Ack(void)

{

uint16 uErrTime=0;

SDA_IN(); //SDA設(shè)置為輸入

IIC_SDA(1);

hrt_delay_us(9);

IIC_SCL(1);

hrt_delay_us(9);

while(READ_SDA)

{

uErrTime++;

if(uErrTime > 250)

{

IIC_Stop();

return 1;

}

//hrt_delay_us(1);

}

IIC_SCL(0);//時(shí)鐘輸出0

hrt_delay_us(2);

return 0;

}

//產(chǎn)生ACK應(yīng)答

void IIC_Ack(void)

{

IIC_SCL(0);

SDA_OUT();

IIC_SDA(0);

hrt_delay_us(9);

IIC_SCL(1);

hrt_delay_us(9);

IIC_SCL(0);

}

//不產(chǎn)生ACK應(yīng)答

void IIC_NAck(void)

{

IIC_SCL(0);

SDA_OUT();

IIC_SDA(1);

hrt_delay_us(9);

IIC_SCL(1);

hrt_delay_us(9);

IIC_SCL(0);

}

//IIC發(fā)送一個(gè)字節(jié)

//返回從機(jī)有無(wú)應(yīng)答

//1,有應(yīng)答

//0,無(wú)應(yīng)答

void IIC_Send_Byte(uint8 txd)

{

uint8 t=0;

SDA_OUT();

IIC_SCL(0);//拉低時(shí)鐘開(kāi)始數(shù)據(jù)傳輸

for(t=0;t<8;t++)

{

IIC_SDA((txd&0x80)>>7);

txd <<= 1;

hrt_delay_us(8);

IIC_SCL(1);

hrt_delay_us(8);

IIC_SCL(0);

hrt_delay_us(8);

}

}

//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK

uint8 IIC_Read_Byte(unsigned char ack)

{

unsigned char i;

unsigned charrecv=0;

SDA_IN();//SDA設(shè)置為輸入

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

{

IIC_SCL(0);

hrt_delay_us(12);

IIC_SCL(1);

recv <<= 1;

if(READ_SDA)

{

recv++;

}

hrt_delay_us(9);

}

return recv;

}void IIC_Write(unsigned char dat)

{

unsigned char t;

for(t=0; t<8; t++)

{

if(dat & 0x80)

{

IIC_SDA(1);

}

else

{

IIC_SDA(0);

}

delay_us(10);

IIC_SCL(1);

delay_us(10);

IIC_SCL(0);

delay_us(10);

dat <<= 1;

}

}

uint8 getBatteryInfo(uint8 slaveAddr, uint8 Comcode,uint8 *data, uint8 size)

{

uint8 ackFlag=0;

uint8_t buff[2];

IIC_Start();

IIC_Send_Byte(slaveAddr);//發(fā)送地址

IIC_Wait_Ack();

IIC_Send_Byte(Comcode);

IIC_Wait_Ack();

rt_thread_delay(1);

IIC_Start();

IIC_Send_Byte(slaveAddr+1);//發(fā)送地址

IIC_Wait_Ack();

rt_thread_delay(1);

while(size-1)

{

*data = IIC_Read_Byte(1);

IIC_Ack();

hrt_delay_us(10);

data++;

size--;

}

rt_thread_delay(1);

*data++ = IIC_Read_Byte(0);

IIC_Stop();

rt_thread_delay(5);

}

注意: 在SDA輸入輸出切換時(shí),最好使用寄存器操作!!!

總結(jié)

以上是生活随笔為你收集整理的bq4050读固件_stm32f767 实现模拟SMBUS驱动bq4050的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。