#include "stm32f10x.h"
#include "sys.h"
//************************************
#define uint32_t unsigned int
#define uint8_t unsigned char
#define Nack_counter 10
#define IIC_counter 10
float Value;
extern void delay_us(uint32_t);
//**************端口定义**************
//mlx90614端口定义
//棕色 正 黑色 负
//SCL时钟线(h色线) PA7
//SDA数据线(b色线) PA6
/*
#define SCL_SET GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define SCL_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define SDA_SET GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define SDA_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_11)
*/
//IO方向设置
#define SDA_IN() {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=8;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=3;}
#define SCL PBout(9)
#define SDA PBout(8) //SDA
#define READ_SDA PBin(8) //输入SDA
//************????****************
uint8_t bit_out;
uint8_t bit_in;
uint8_t DataH,DataL,Pecreg;
//************????***********************************
void start_bitsz(void); //MLX90614???????
void stop_bitsz(void); //MLX90614???????
uint8_t rx_bytesz(void); //MLX90614???????
void send_bitsz(void); //MLX90614??????
void tx_bytesz(uint8_t dat_byte); //MLX90614???????
void receive_bitsz(void); //MLX90614??????
uint32_t memreadsz(void); //?????
uint32_t ta_memreadsz(void); //?????
//*********???????*********
//************************************
void start_bitsz(void)
{
SDA_OUT();
SDA=1;
delay_us(IIC_counter);
delay_us(IIC_counter);
SCL=1;
delay_us(IIC_counter);
SDA=0;
delay_us(IIC_counter);
SCL=0;
delay_us(IIC_counter);
}
//------------------------------
void stop_bitsz(void)
{
SDA_OUT();
SCL=0;
SDA=0;
delay_us(IIC_counter);
SCL=1;
delay_us(IIC_counter);
SDA=1;
}
//---------??????---------
void tx_bytesz(uint8_t dat_byte)
{
char i,n,dat;
n=Nack_counter;
TX_again:
dat=dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bitsz();
dat=dat<<1;
}
receive_bitsz();
if(bit_in==1)
{
stop_bitsz();
if(n!=0)
{
n--;
goto Repeat;
}
else
goto exit;
}
else
goto exit;
Repeat:
start_bitsz();
goto TX_again;
exit: ;
}
//-----------?????---------
void send_bitsz(void)
{
SDA_OUT();
if(bit_out==0)
SDA=0;
else
SDA=1;
delay_us(IIC_counter);
// delay_us(IIC_counter);
SCL=1;
delay_us(IIC_counter);
delay_us(IIC_counter);
SCL=0;
delay_us(IIC_counter);
}
//----------??????--------
uint8_t rx_bytesz(void)
{
uint8_t i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bitsz();
if(bit_in==1)
dat=dat+1;
}
send_bitsz();
return dat;
}
//----------?????----------
void receive_bitsz(void)
{
SDA_IN();
SDA=1;//bit_in=1;
delay_us(IIC_counter);
delay_us(IIC_counter);
SCL=1;
delay_us(IIC_counter);
delay_us(IIC_counter);
bit_in=READ_SDA;
// delay_us(IIC_counter);
SCL=0;
// delay_us(IIC_counter);
}
//------------??--------------
//------------------------------
uint32_t memreadsz(void)
{
start_bitsz();
tx_bytesz(0x00); //Send SlaveAddress
//if(_Is90614)
tx_bytesz(0x07); //Send Command
//else
// tx_bytesz(0x27); //Send Command
// delay_us(0x3FFF);
start_bitsz();
tx_bytesz(0x01);
bit_out=0;
DataH=rx_bytesz();
bit_out=0;
DataL=rx_bytesz();
bit_out=1;
Pecreg=rx_bytesz();
stop_bitsz();
// return(DataL*256+DataH);
Value=(DataL*256+DataH);
Value = Value * 10;
Value = Value/50 - 2731;
return(Value);
}
uint32_t ta_memreadsz(void) //环境温度
{
start_bitsz();
tx_bytesz(0x00); //Send SlaveAddress
//if(_Is90614)
tx_bytesz(0x06); //Send Command
//else
// tx_bytesz(0x27); //Send Command
// delay_us(0x3FFF);
start_bitsz();
tx_bytesz(0x01);
bit_out=0;
DataH=rx_bytesz();
bit_out=0;
DataL=rx_bytesz();
bit_out=1;
Pecreg=rx_bytesz();
stop_bitsz();
// return(DataL*256+DataH);
Value=(DataL*256+DataH);
Value = Value * 10;
Value = Value/50 - 2731;
return(Value);
}
评论3