新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2015-2-5
- 在线时间
- 0 小时
|
5金钱
有谁用过KS103超声波模块吗?我的出来的数据都是0,敢问是怎么回事啊。。。
#ifndef __KS103_H
#define __KS103_H
#include "sys.h"
#define SlaveAddress1 0xE8
#define SlaveAddress2 0xd0
#define SlaveAddress3 0xd2
#define SlaveAddress4 0xd4
#define SlaveAddress5 0xd6
#define SlaveAddress6 0xd8
#define SlaveAddress7 0xda
#define SlaveAddress8 0xdc
#define SlaveAddress9 0xde
#define SlaveAddress10 0xe0
#define SlaveAddress11 0xe2
#define SlaveAddress12 0xe4
#define SlaveAddress13 0xe6
#define SlaveAddress14 0xea
#define SlaveAddress15 0xec
#define SlaveAddress16 0xee
#define SlaveAddress17 0xf8
#define SlaveAddress18 0xfa
#define SlaveAddress19 0xfc
#define SlaveAddress20 0xfe
void I2C2_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Send_Byte(u8 txd);
u8 IIC_Read_Byte(unsigned char ack);
u8 IIC_Wait_Ack(void);
void IIC_Ack(void);
void IIC_NAck(void);
u8 Single_ReadI2C(u8 SlaveAddress,u8 REG_Address);
void Single_WriteI2C(u8 SlaveAddress,u8 REG_Address,u8 REG_data);
u32 Read_KS10X(u8 SlaveAddress);
void Change_Addr(u8 OldAdddr,u8 NewAddr);
float Read_KS10X_Data(u8 SlaveAddress);
void KS10X_Change_Addr_Init(u8 OldAddr,u8 NewAddr);
#endif
//KS103.C
#include "sys.h"
#include "delay.h"
#include "math.h"
#include "ks103.h"
#define uchar unsigned char
#define uint unsigned int
#define SCL PBout(12)
#define SDA PBout(13)
#define READ_SDA PBin(13)
#define SDA_IN() {GPIOB->CRH&=0xff0fffff;GPIOB->CRH|=0x00800000;/*GPIOB->ODR|=1<<11;*/}
#define SDA_OUT() {GPIOB->CRH&=0xff0fffff;GPIOB->CRH|=0x00300000;}
u16 sum;
void I2C2_Init()
{
RCC->APB2ENR|=1<<3;
GPIOB->CRH&=0xff00ffff;
GPIOB->CRH|=0x00330000;
GPIOB->ODR|=1<<12;
GPIOB->ODR|=1<<13;
}
void IIC_Start(void)
{
SDA_OUT();
SDA=1;
SCL=1;
delay_us(10);
SDA=0;
delay_us(10);
SCL=0;
}
void IIC_Stop(void)
{
SDA_OUT();
SCL=0;
SDA=0;
delay_us(10);
SCL=1;
SDA=1;
delay_us(10);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
SDA=1;delay_us(6);
SCL=1;delay_us(6);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
SCL=0;
return 0;
}
void IIC_Ack(void)
{
SCL=0;
SDA_OUT();
SDA=0;
delay_us(10);
SCL=1;
delay_us(10);
SCL=0;
}
void IIC_NAck(void)
{
SCL=0;
SDA_OUT();
SDA=1;
delay_us(10);
SCL=1;
delay_us(10);
SCL=0;
}
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
SCL=0;
for(t=0;t<8;t++)
{
SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(10);
SCL=1;
delay_us(10);
SCL=0;
delay_us(10);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
SCL=0;
delay_us(10);
SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(5);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
void Single_WriteI2C(u8 SlaveAddress,u8 REG_Address,u8 REG_data)
{
IIC_Start();
IIC_Send_Byte(SlaveAddress);
while(IIC_Wait_Ack());
IIC_Send_Byte(REG_Address);
while(IIC_Wait_Ack());
IIC_Send_Byte(REG_data);
while(IIC_Wait_Ack());
IIC_Stop();
}
u8 Single_ReadI2C(u8 SlaveAddress,u8 REG_Address)
{
u8 REG_data=0;
IIC_Start();
IIC_Send_Byte(SlaveAddress);
while(IIC_Wait_Ack());
IIC_Send_Byte(REG_Address);
while(IIC_Wait_Ack());
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
while(IIC_Wait_Ack());
delay_us(50); //50
REG_data=IIC_Read_Byte(0);
// IIC_NAck();
// delay_us(2);
IIC_Stop();
return REG_data;
}
u32 Read_KS10X(u8 SlaveAddress)
{
// delay_ms(80);
sum=Single_ReadI2C(SlaveAddress,0x02);
sum<<=8;
sum+=Single_ReadI2C(SlaveAddress,0x03);
return sum;
}
void Change_Addr(u8 OldAdddr,u8 NewAddr)
{
// delay_ms(500);
Single_WriteI2C(OldAdddr,0x02,0x9a);
delay_ms(1);
Single_WriteI2C(OldAdddr,0x02,0x92);
delay_ms(1);
Single_WriteI2C(OldAdddr,0x02,0x9e);
delay_ms(1);
Single_WriteI2C(OldAdddr,0x02,NewAddr);
delay_ms(100);
}
float Read_KS10X_Data(u8 SlaveAddress)
{
float sumx;
float sum_x;
Single_WriteI2C(SlaveAddress,0x02,0xb0);
delay_ms(800);
sumx = Read_KS10X(SlaveAddress);
return sum_x;
}
void KS10X_Change_Addr_Init(u8 OldAddr,u8 NewAddr)
{
Change_Addr(OldAddr,NewAddr);
delay_ms(80);
}
//主函数
int main(void)
{
delay_init();
NVIC_Configuration();
UART2_init(115200);
I2C2_Init();
while(1)
{
sum_1 = Read_KS10X_Data(SlaveAddress1);
printf("%d\r\n",sum_1);
}
}
|
|