OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3409|回复: 1

KS103读数有问题

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-2-5
在线时间
0 小时
发表于 2015-7-30 00:10:10 | 显示全部楼层 |阅读模式
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);  
 
}
 }









正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-30 21:22:12 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 06:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表