DSP28335控制MLX90614
这是我写的代码,有点乱,但是功能可以使用了,有需要的可以看看。头文件
#ifndef DSP28_MLX90614_H
#define DSP28_MLX90614_H
#define input_90614() {EALLOW;GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;GpioCtrlRegs.GPADIR.bit.GPIO16=0;EDIS;}
#define output_90614() {EALLOW;GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;GpioCtrlRegs.GPADIR.bit.GPIO16=1;EDIS;}
#define SDA_90614_in GpioDataRegs.GPADAT.bit.GPIO16
#define SDA_90614_OUT_H {output_90614();GpioDataRegs.GPADAT.bit.GPIO16=1;}
#define SDA_90614_OUT_L {output_90614();GpioDataRegs.GPADAT.bit.GPIO16=0;}
#define SCLK_90614_H {EALLOW;GpioCtrlRegs.GPADIR.bit.GPIO17=1;EDIS;GpioDataRegs.GPADAT.bit.GPIO17=1;}
#define SCLK_90614_L {EALLOW;GpioCtrlRegs.GPADIR.bit.GPIO17=1;EDIS;GpioDataRegs.GPADAT.bit.GPIO17=0;}
#define EEPROM_90614 0x20
#define ROM_90614 0x00
extern void delay_90614(void);
extern unsigned char get_ack(void);
extern void delay_90614us(u_long datax);
extern void start_90614(void);
extern void init_90614(void);
extern void write_90614_slave(u_char address);
extern void stop_90614(void);
extern void set_90614_slave( u_char old_slave,u_char new_slave);
extern unsigned int get_90614_temp(u_char slave,u_char command);
extern void write_90614_process(unsigned char slave,unsigned char command,unsigned char DATA_H,unsigned char DATA_L);
extern unsigned char readbyte_90614(void);
extern void set_90614_emissivity(u_char slave,u_int emissivity);
extern void write_90614_byte( unsigned char data_byte);
extern unsigned char get_pec(unsigned char *par, unsigned char len);
#endif
C文件
#include "DSP2833x_Device.h"
unsigned char pecdata={0};
static const unsigned char crc_table[]=
{
0x00,0x07,0x0e,0x09,0x1c,0x1b,0x12,0x15,
0x38,0x3f,0x36,0x31,0x24,0x23,0x2a,0x2d,
0x70,0x77,0x7e,0x79,0x6c,0x6b,0x62,0x65,
0x48,0x4f,0x46,0x41,0x54,0x53,0x5a,0x5d,
0xe0,0xe7,0xee,0xe9,0xfc,0xfb,0xf2,0xf5,
0xd8,0xdf,0xd6,0xd1,0xc4,0xc3,0xca,0xcd,
0x90,0x97,0x9e,0x99,0x8c,0x8b,0x82,0x85,
0xa8,0xaf,0xa6,0xa1,0xb4,0xb3,0xba,0xbd,
0xc7,0xc0,0xc9,0xce,0xdb,0xdc,0xd5,0xd2,
0xff,0xf8,0xf1,0xf6,0xe3,0xe4,0xed,0xea,
0xb7,0xb0,0xb9,0xbe,0xab,0xac,0xa5,0xa2,
0x8f,0x88,0x81,0x86,0x93,0x94,0x9d,0x9a,
0x27,0x20,0x29,0x2e,0x3b,0x3c,0x35,0x32,
0x1f,0x18,0x11,0x16,0x03,0x04,0x0d,0x0a,
0x57,0x50,0x59,0x5e,0x4b,0x4c,0x45,0x42,
0x6f,0x68,0x61,0x66,0x73,0x74,0x7d,0x7a,
0x89,0x8e,0x87,0x80,0x95,0x92,0x9b,0x9c,
0xb1,0xb6,0xbf,0xb8,0xad,0xaa,0xa3,0xa4,
0xf9,0xfe,0xf7,0xf0,0xe5,0xe2,0xeb,0xec,
0xc1,0xc6,0xcf,0xc8,0xdd,0xda,0xd3,0xd4,
0x69,0x6e,0x67,0x60,0x75,0x72,0x7b,0x7c,
0x51,0x56,0x5f,0x58,0x4d,0x4a,0x43,0x44,
0x19,0x1e,0x17,0x10,0x05,0x02,0x0b,0x0c,
0x21,0x26,0x2f,0x28,0x3d,0x3a,0x33,0x34,
0x4e,0x49,0x40,0x47,0x52,0x55,0x5c,0x5b,
0x76,0x71,0x78,0x7f,0x6a,0x6d,0x64,0x63,
0x3e,0x39,0x30,0x37,0x22,0x25,0x2c,0x2b,
0x06,0x01,0x08,0x0f,0x1a,0x1d,0x14,0x13,
0xae,0xa9,0xa0,0xa7,0xb2,0xb5,0xbc,0xbb,
0x96,0x91,0x98,0x9f,0x8a,0x8d,0x84,0x83,
0xde,0xd9,0xd0,0xd7,0xc2,0xc5,0xcc,0xcb,
0xe6,0xe1,0xe8,0xef,0xfa,0xfd,0xf4,0xf3
};
//////////////
void init_90614(void){
// MUXB= 0x00;// GpioCtrlRegs.GPAMUX2.bit./
// MUXC= 0x00;// GpioCtrlRegs.GPAMUX2.bit.GPIO17
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0x00;
GpioCtrlRegs.GPADIR.bit.GPIO16 = 0x01;
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0x00;
GpioCtrlRegs.GPADIR.bit.GPIO17 = 0x01;
SCLK_90614_H;
SDA_90614_OUT_H;
}
C文件
////delay1us
void delay_90614(void)
{
u_long i;
i=7;
while(i--);
}
////////////
//////////////
void delay_90614us(u_long datax)
{
u_long i;
i=datax;
while(i--)
delay_90614();
}
/////////////
////////////////////////
void start_90614(void)
{
output_90614();
delay_90614us(8);
SDA_90614_OUT_H;
delay_90614us(1);
SCLK_90614_H;
// delay_90614us(1);
// SDA_90614_OUT_H;
delay_90614us(10);
SDA_90614_OUT_L;
delay_90614us(10);
SCLK_90614_L;
}
///////////////////////////////
////////////////////////////
void stop_90614(void)
{
output_90614();
SCLK_90614_H;
SDA_90614_OUT_L;
delay_90614us(10);
SDA_90614_OUT_H;
delay_90614us(10);
SCLK_90614_L;
delay_90614us(10);
} C文件
void write_90614_slave(u_char address)
{
u_char slave_address=0;
u_char i;
slave_address = address;
SCLK_90614_L;
output_90614();
delay_90614us(2);
for(i=0;i<8;i++)
{
if((slave_address & 0x80) == 0x80)
{ SDA_90614_OUT_H;}
else SDA_90614_OUT_L;
delay_90614us(20);
slave_address <<=1;
SCLK_90614_H;
delay_90614us(20);
SCLK_90614_L;
}
//////////////////////////////////
//////////////////////////////////
unsigned char get_pec(unsigned char *par, unsigned char len)
{
unsigned char i,crc,data;
crc=0x00;
// data=*par++;
while(len--){
crc = crc_table;
// data =;
}
return (crc);
} C文件
void write_90614_byte( unsigned char data_byte)
{
u_char slave_address=0;
u_char i;
slave_address = data_byte;
SCLK_90614_L;
output_90614();
// delay_90614us(2);
for(i=0;i<8;i++)
{
if((slave_address & 0x80) == 0x80)
{ SDA_90614_OUT_H;}
else SDA_90614_OUT_L;
delay_90614us(20);
slave_address <<=1;
SCLK_90614_H;
delay_90614us(20);
SCLK_90614_L;
// input_90614();
// return (SDA_90614_in);
}
delay_90614us(3);
}
///////////////////////////////////////////////////
/////////////////////////////////////
unsigned char get_ack(void)
{
u_char ack;
// SDA_90614_OUT_L;
input_90614();
// SCLK_90614_L;
delay_90614us(20);
if(SDA_90614_in ==1)
ack = 1;
else ack = 0;
// delay_90614us(2);
SCLK_90614_H;
delay_90614us(20);
SCLK_90614_L;
return ack;
}
C文件
//////////////////////////////////////////////
unsigned char readbyte_90614(void)
{
unsigned char data,i;
data = 0;
input_90614();
// delay_90614us(10);
SCLK_90614_L;
for(i=0;i<8;i++)
{
data<<=1;
if(SDA_90614_in == 1)
data|=0x01;
else data|=0x00;
SCLK_90614_L;
delay_90614us(10);
SCLK_90614_H;
delay_90614us(20);
SCLK_90614_L;
delay_90614us(10);
}
SCLK_90614_L;
// output_90614();
SDA_90614_OUT_L;
delay_90614us(20);
SCLK_90614_H;
delay_90614us(20);
return data;
}
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
void write_90614_process(unsigned char slave,unsigned char command,unsigned char DATA_L,unsigned char DATA_H)
{
u_char pec_data,ack_data,i,new_slave,new_command;
output_90614();
new_slave = slave;
new_slave<<=1;
new_command = command;
new_command = new_command | 0x20 ;
pecdata = new_slave;
pecdata = new_command;
pecdata = DATA_L;
pecdata = DATA_H;
pecdata = 0x00;
i=10;
pec_data = get_pec(pecdata,4);
while(i>0)
{
start_90614();
write_90614_byte(new_slave);
ack_data = get_ack();
if(ack_data == 0)
{
write_90614_byte(new_command);
ack_data = get_ack();
if(ack_data == 0)
{
write_90614_byte(DATA_L);
ack_data = get_ack();
if(ack_data == 0)
{
write_90614_byte(DATA_H);
ack_data = get_ack();
if(ack_data == 0)
{
write_90614_byte(pec_data);
ack_data = get_ack();
if(ack_data == 0)
{
i=0;
stop_90614();
}
else
{
i--;
stop_90614();
}
}
else
{
i--;
stop_90614();
}
}
else
{
i--;
stop_90614();
}
}
else
{
i--;
stop_90614();
}
}
else
{
i--;
stop_90614();
}
}
}
///////////////////////////////////////////////////
C文件
//////////////////////////////////////////////////////
void set_90614_slave( u_char old_slave,u_char new_slave)
{
u_char old_slave1,new_slave1;
old_slave1 = old_slave;
new_slave1 = new_slave;
write_90614_process(old_slave1,0x0e,0x00,0x00);
delay_90614us(10000);
write_90614_process(old_slave1,0x0e,new_slave1,0x00);
}
//////////////////////////////////////////
/////////////////////////////////
void set_90614_emissivity(u_char slave,u_int emissivity)
{
u_char data_L,data_H,new_slave;
data_L = emissivity & 0x00ff;
data_H = (emissivity>>8) & 0x00ff;
write_90614_process(new_slave,0x04,0x00,0x00);
delay_90614us(10000);
write_90614_process(new_slave,0x04,data_L,data_H);
}
///////////////////////////////////////////
////////////////////////////////////////////////////////
unsigned int get_90614_temp(u_char slave,u_char command)
{
u_char TEMP_H,TEMP_L,pec_data,ack_data,i,new_slave;
int TEMP_90614 = 10;
unsigned int data_temp;
i=10;
while(i>0)
{
new_slave = slave;
start_90614();
new_slave <<=1;
write_90614_byte(new_slave);
ack_data = get_ack();
if(ack_data == 0 )
{
write_90614_byte(command);
ack_data = get_ack();
if(ack_data == 0 )
{
start_90614();
new_slave = slave;
new_slave <<=1;
new_slave +=1;
write_90614_byte(new_slave);
ack_data = get_ack();
if(ack_data == 0 )
{
TEMP_L = readbyte_90614();
TEMP_H = readbyte_90614();
pec_data = readbyte_90614();
stop_90614();
i = 0;
TEMP_90614 = (TEMP_H << 8) | TEMP_L ;
TEMP_90614 = TEMP_90614 * 2 - 27315;
}
else
{
i--;
stop_90614();
}
}
else
{
i--;
stop_90614();
}
}
else
{
i--;
stop_90614();
}
}
if(TEMP_90614 > 100)
data_temp = TEMP_90614;
else
{
data_temp = ~ (TEMP_90614 - 1);
data_temp = data_temp | 0x80;
}
return (data_temp);
}
///////////////////////////////////////////////////////////
。
111111111
页:
[1]