STM32_ADS1110的通讯程序IO口模拟I2C
发布时间:2024-11-17
发布时间: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,程序已调通,可以直接调用。
上一篇:中小学教师法律法规知识试题及答案
下一篇:初中物理光学部分单元测试题答案