STM32_ADS1110的通讯程序IO口模拟I2C

发布时间:2024-11-17

STM32_ADS1110的通讯程序IO口模拟I2C,程序已调通,可以直接调用。

#define I2C_H

#include "i2c.h"

void Delay_1us(void)

{

u8 i;

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

}

void Delay_us(u8 n)

{

u8 i;

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

{

Delay_1us();

}

}

////////////////////////////////

////////////起动总线////////////

void I2C_start(void)

{

SDA_1();

SCL_1();

Delay_us(1);

SDA_0();

Delay_us(1);

SCL_0();

}

////////////////////////////////

////////////结束总线////////////

void I2C_stop(void)

{

SDA_0();

//SCL_0();

Delay_us(1);

SCL_1();

Delay_us(1);

SDA_1();

Delay_us(1);

SCL_0();

}

STM32_ADS1110的通讯程序IO口模拟I2C,程序已调通,可以直接调用。

////////////////////////////////

////////////等待应答////////////

void Waitack(void)

{

//GPIO_InitTypeDef GPIO_InitStructure;

u16 i = 5000;

SCL_0();

GPIOB->CRL &= 0x0fffffff;

GPIOB->CRL |= 0x40000000; //PB7

SCL_1();

Delay_us(1);

while(SDAI)

{

i--;

if(i==0) break;

}

//while((SDA==1)&&(i<5000)) i++;

SCL_0();

GPIOB->CRL &= 0x0fffffff;

GPIOB->CRL |= 0x10000000; //PB7

Delay_us(1);

}

/////////////////////////////////

/////////写应答或非应答//////////

void WriteACK(u8 ack)

{

if(ack == 0) SDA_0();

else SDA_1();

//SDA=ack;

Delay_us(1);

SCL_1();

Delay_us(1);

SCL_0();

}

/////////////////////////////////

////////////写数据字节///////////

void Write_byte(u8 ch) 浮空输入 推挽输出 10MHz

STM32_ADS1110的通讯程序IO口模拟I2C,程序已调通,可以直接调用。

u8 i=8;

while(i--)

{

SCL_0();

Delay_us(1);

//SDA=(bit)(ch&0x80);

if(ch&0x80) SDA_1();

else SDA_0();

ch<<=1;

Delay_us(1);

SCL_1();

Delay_us(1);

}

SCL_0();

Waitack();

}

///////////////////////////////

///////////读数据字节//////////

u8 Read_byte(void)

{

//GPIO_InitTypeDef GPIO_InitStructure;

u8 i=8;

u8 ddata=0;

//SDA_1();

GPIOB->CRL &= 0x0fffffff;

GPIOB->CRL |= 0x40000000; //PB7 浮空输入 while(i--)

{

ddata <<= 1;

SCL_0();

Delay_us(1);

SCL_1();

Delay_us(1);

if(SDAI)

ddata |= 0x01;

}

SCL_0();

GPIOB->CRL &= 0x0fffffff;

GPIOB->CRL |= 0x10000000; //PB7 推挽输出 10MHz

return ddata;

STM32_ADS1110的通讯程序IO口模拟I2C,程序已调通,可以直接调用。

/////////////////////////////

/////ADS1110写配置寄存器/////

void Write_ADS1110(void)

{

I2C_start();

Write_byte(0x94); //ED2

Write_byte(0x0c); //8scs 连续转换 增益为1 I2C_stop();

}

////////////////////////////

//////ADS1110读取数据///////

u16 Read_ADS1110(void)

{

u8 SWH,SWL; //,i

u16 x;

Write_ADS1110();

// DelayNS(20); //

SWH=0;

SWL=0;

x=0;

//do

//{

I2C_start();

Write_byte(0x95);

SWH=Read_byte();

WriteACK(0); //应答0

SWL=Read_byte();

WriteACK(0); //应答0

//Read_byte();

//WriteACK(0); //应答0

I2C_stop();

//}

//while(h&0x80); //单次转换完成

x = SWH;

x = x<<8;

x += SWL;

return x;

}

/////////////////////

STM32_ADS1110的通讯程序IO口模拟I2C,程序已调通,可以直接调用。

STM32_ADS1110的通讯程序IO口模拟I2C.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219