/*
*红外HXD019D 驱动代码,芯片红外数据固定232字节。红外码229字节,剩余3个字节为芯片本身校验码
*代码已具有学习、发送功能
*/
#include "Onboard.h"
#include "ioCC2530.h"
#include "sino_hal_config.h"
#include "IR_HXD019.h"
#define SCL P1_7
#define SDA P1_2
#define BUSY P1_3
#define I2C_SCL_H do{SCL=1;}while(0)
#define I2C_SCL_L do{SCL=0;}while(0)
#define I2C_SDA_H do{SDA=1;}while(0)
#define I2C_SDA_L do{SDA=0;}while(0)
#define SDA_OUT_ENABLE do{P1DIR |= (1<<2);}while(0)
#define SDA_IN_ENABLE do{P1DIR &= ~(1<<2);}while(0)
#define DELAY_40_US 28
#define DELAY_20_MS 20
#define NO_ACK 1
#define RECEIVE_ACK 0
#define GIR_DA (uint8) (SDA)
#define GIR_BY (uint8) (BUSY)
#define NO_ERROR 0
#define ERROR 1
#define BUF_SIZE 300
extern uint8 IRDA_learn_data_in_out(uint8*);
static uint8 g_buf[BUF_SIZE];
void delay_us(uint16 us)
{
MicroWait(us);
}
void delay_ms(uint16 Time)
{
while(Time--)
{
delay_us(1000);
}
}
void I2cOpen()
{
SDA_OUT_ENABLE;
I2C_SCL_H;
I2C_SDA_H;
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
#if 1
I2C_SCL_L;
delay_us(DELAY_40_US);
//delay_us(DELAY_40_US);
I2C_SCL_H;
#endif
delay_ms(40);///20ms
}
void I2cStart()
{
SDA_OUT_ENABLE;
I2C_SCL_H;
I2C_SDA_H;
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
I2C_SDA_L;
delay_us(DELAY_40_US * 10);
I2C_SCL_L;
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
}
void I2cClose()
{
SDA_OUT_ENABLE;
I2C_SCL_L;
I2C_SDA_L;
delay_us(DELAY_40_US);
I2C_SCL_H;
delay_us(DELAY_40_US);
I2C_SDA_H;
delay_us(DELAY_40_US);//stop
}
uint8 GetAck()
{
uint8 ack;
ack = NO_ACK;
I2C_SCL_L;
SDA_IN_ENABLE;
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
I2C_SCL_H;
delay_us(DELAY_40_US);
ack = GIR_DA;
delay_us(DELAY_40_US);
I2C_SCL_L;
delay_us(DELAY_40_US*4);
return ack;
}
void SenAck(void)
{
SDA_OUT_ENABLE;
I2C_SCL_L;
delay_us(DELAY_40_US);
I2C_SDA_L;
delay_us(DELAY_40_US);
I2C_SCL_H;
delay_us(DELAY_40_US);
I2C_SCL_L;
}
uint8 I2CWriteData(uint8 d)
{
uint8 d_bit;
uint8 ack;
int16 i;
SDA_OUT_ENABLE;
for(i=7;i>=0;i--){
I2C_SCL_L;
delay_us(50);
d_bit = ((d >> i) & 0x01);
if(d_bit)
I2C_SDA_H;
else
I2C_SDA_L;
delay_us(10);
I2C_SCL_H;
delay_us(28);
I2C_SCL_L;
}
ack = GetAck();
return ack;
}
void I2CReadData(uint8 *p)
{
uint8 i;
uint8 data=0;
SDA_IN_ENABLE;
for (i = 0; i < 8; i++) {
data <<= 1;
I2C_SCL_H;
delay_us(DELAY_40_US);
data |= GIR_DA&0x1;
I2C_SCL_L;
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
}
I2C_SCL_L;
delay_us(DELAY_40_US);
*p = data;
SenAck();
delay_us(DELAY_40_US * 2);
}
uint8 ReadI2c(uint8 *buf,uint8 *ch)
{
uint8 data;
uint8 i,j;
volatile uint8 checksum;
I2cOpen();
I2cStart();
delay_us(DELAY_40_US);
///-----------------
I2CWriteData(0x30);
delay_us(DELAY_40_US);
I2CWriteData(0x62);
delay_us(DELAY_40_US);
#if 1
I2cStart();
delay_us(DELAY_40_US);
#endif
I2CWriteData(0x31);
delay_us(DELAY_40_US);
I2CReadData(&data);
delay_us(DELAY_40_US);
if(data != 0x00)
{
I2cClose();
return 0;
}
buf[0] = 0x30;
buf[1] = 0x03;
checksum = 0;
for (i = 2; i < 231; i++) {///--229
I2CReadData(&data);
delay_us(DELAY_40_US);
buf[i] = data;
checksum += data;
}
buf[231] = checksum + 0x30 + 0x3;
delay_us(DELAY_40_US);
I2cClose();
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
if(data != checksum){
checksum = 0;
}
return NO_ERROR;
}
void WriteI2c(uint8 *buf, uint8 count)
{
uint16 i;
I2cOpen();
delay_us(DELAY_40_US);
I2cStart();
delay_us(DELAY_40_US);
for (i = 0; i < count; i++) {
I2CWriteData(buf[i]);
delay_us(DELAY_40_US);
}
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
I2cClose();
}
void Learn_start()
{
I2cOpen();
I2cStart();
I2CWriteData(0x30);
delay_us(DELAY_40_US);
I2CWriteData(0x20);
delay_us(DELAY_40_US);
I2CWriteData(0x50);
delay_us(DELAY_40_US);
delay_us(DELAY_40_US);
I2cClose();
delay_us(DELAY_40_US);
delay_ms(DELAY_20_MS);//20ms
}
void IR_init()
{
#if 0
P0SEL &= ~0x70;
P0DIR |= (1<<4);
P0DIR |= (1<<6);
P0DIR &= ~(1<<5);
P0INP &= ~(1<<5);
//P2INP |= (1<<5);
#endif
P1SEL &= ~(1<<2);
P1SEL &= ~(1<<7);
P1SEL &= ~(1<<3);
P1DIR |= (1<<2);
P1DIR |= (1<<7);
P1DIR &= ~(1<<3);
SDA_OUT_ENABLE;
I2C_SCL_H;
I2C_SDA_H;
}
void ir_test()
{
uint8 get_data_len;
IR_init();
Learn_start();
while (GIR_BY==0);
ReadI2c(g_buf,&get_data_len);
for(;;){
delay_ms(2000);
WriteI2c(g_buf,232);
}
}