sop板
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

356 lines
7.7 KiB

4 years ago
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2018, ���ؿƼ�
/// All rights reserved.
///
/// @file iic_sim
/// @brief iic ģ��io �汾�� ��cpu�޹أ�Ψһ��Ҫ�޸ĵľ���ͷ�����еĹܽŶ���
/// @info ���ޱ�Ҫ�����޸�
///�����ļ�ʵ�ֵĹ��ܵ�������
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20180102
//
//////////////////////////////////////////////////////////////////////////
#include "iic_sim.h"
/*------------------------------------------------
˿ڶ
I2CߴݹУÿһֽڣ
ҪһӦ״̬λݵ
ͨӦλ֪Ӧλʱ
Ӧλ״̬ѭ˭
˭ԭ򣬼ɽӦλ
ӦʱڼSDA
ͣʹʱĸߵƽڼȶĵ͵ƽͼ9
Ȼǽͱʱ
ϸı6 ӻʱ
ӦλɴӻӴӻʱӦλ
I2C߱׼ ӦλΪ0ʾӦ ACK
ΪA Ϊ1ʾӦ NACK
ΪNALSB֮ӦͷSDAߣSDA
ԵȴӦλ
ڽһֽڵݣ
߲ٽոʱӦӦ
ֽ֪ͨ˷Ӧ״̬
Ӧֹ͡
------------------------------------------------*/
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L0_I2C_SCL(unsigned char v)
{
if(v)
{
L0_SCL_ON();
L0_slc_1_delay();
}
else
{
L0_SCL_OFF();
L0_slc_0_delay();
}
}
void L0_I2C_SDA(unsigned char v)
{
if(v)
{
L0_SDA_ON();
L0_slc_1_delay();
}
else
{
L0_SDA_OFF();
L0_slc_0_delay();
}
}
void L0_I2C_INIT(unsigned char v)
{
if (v)
{
L0_IIC_SIM_INIT();
L0_I2C_SDA(1);
L0_I2C_SCL(1);
}else
{
}
}
unsigned char L0_I2C_SDA_ask(void)
{
return L0_SDA_AT();
}
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/****************
void L0_I2C_Reset(void)
{
L0_I2C_SCL(1); L0_I2C_SDA(1); //ȷ���ͷ�����
}
********************/
//**********************************************
//����ʼλ IO_SDA=1->0
void L0_I2C_Start(void)
{
L0_IIC_SIM_INIT();
L0_I2C_SDA(1);
L0_I2C_SCL(1);
L0_I2C_SDA(0);
L0_I2C_SCL(0);
}
//************************************************
//��ֹͣλ IO_SDA = 0->1
void L0_I2C_Stop(void)
{
L0_I2C_SDA(0);
L0_I2C_SCL(1);
L0_I2C_SDA(1);
L0_IIC_SIM_INIT();
L0_IIC_SIM_close();
}
//************************************************
//��Ӧ��(����ack:IO_SDA = 0��no_ack:IO_SDA = 0)
void L0_I2C_Ack(void)
{ //����SDA ������
L0_I2C_SCL(0);
L0_I2C_SDA(0);
L0_I2C_SCL(1);
L0_I2C_SCL(0);
L0_I2C_SDA(1);
}
void L0_I2C_NoAck(void)
{ //����SDA ������
L0_I2C_SCL(0);
L0_I2C_SDA(1);
L0_I2C_SCL(1);
L0_I2C_SCL(0);
}
/******
I2C߱׼ ӦλΪ0ʾӦ ACK ΪA
Ϊ1ʾӦ NACK ΪNA
LSB֮ӦͷSDAߣSDA
ԵȴӦλ
ڽһֽڵݣ
߲ٽոʱӦӦ
ֽ֪ͨ˷Ӧ״̬
Ӧֹ͡
// ���� SDA�Ƿ���ACK
bit L0_I2C_Test_Ack(void)
{ //����SDA ������
bit ACK_Flag = 0;
L0_I2C_SCL(0);
L0_I2C_SDA(1);
L0_I2C_SCL(1);
if(IO_SDA = 0)
ACK_Flag = 1;
else
ACK_Flag = 0;
L0_I2C_SCL(0);
return ACK_Flag;
// return 1;// debug
}
*******/
//*************************************************
//�ֽڷ��ͳ���
//����c(����������Ҳ���ǵ�ַ)�����������մ�Ӧ��
//�����Ǵ�Ӧ��λ
void L0_I2C_SendData(unsigned char c)
{
unsigned char ack=8;
unsigned char BitCnt=8;//һ�ֽ�8λ
//����SDA ������
for(BitCnt = 0;BitCnt < 8;BitCnt ++) //Ҫ���͵����ݳ���Ϊ8λ
{
if((c << BitCnt ) & 0x80)
L0_I2C_SDA(1); //�жϷ���λ
else
L0_I2C_SDA(0);
L0_I2C_SCL(1); //��ʱ����Ϊ�ߣ�֪ͨ��������ʼ��������λ
L0_I2C_SCL(0);
}//8clk
L0_I2C_SDA(1); //8λ���������ͷ������ߣ�׼������Ӧ��λ
L0_I2C_SCL(1);
///gRccUs05 += L0_I2C_SDA_ask();
L0_I2C_SCL(0);
L0_I2C_delay();
}
//**************************************************
//�ֽڽ��ճ���
//�����������������ݣ��˳���Ӧ����|��Ӧ������|i2c_ack_main(void)ʹ��
//return: uchar��1�ֽ�
unsigned char L0_I2C_ReceiveData(void)
{
unsigned char BitCnt=8,IIC_RX_Data = 0;
L0_I2C_SDA(1); //�������� ����SDA ������
for(BitCnt = 0;BitCnt<8;BitCnt++)
{
L0_I2C_delay(1);
L0_I2C_SCL(0); //��ʱ����Ϊ�ͣ�׼����������λ
L0_I2C_SCL(1); //��ʱ����Ϊ��ʹ��������������Ч
L0_I2C_delay(1);
IIC_RX_Data = IIC_RX_Data << 1;
if(1 == L0_I2C_SDA_ask())
IIC_RX_Data = IIC_RX_Data + 1; //������λ,���յ�����λ����retc��
L0_I2C_delay(1);
}// 8clk up
L0_I2C_SCL(0);
return IIC_RX_Data;
}
/// ��ȡ n������ ����p��
void L1_I2C_ReadNByte(unsigned char Sal, unsigned char *p,unsigned char n)
{
unsigned char i;
L0_I2C_Start(); // ����I2C
L0_I2C_SendData((Sal)| 0x01); //����������ַ
for(i = 0;i<n-1;i++) //��ȡ�ֽ�����
{
*(p + i) = L0_I2C_ReceiveData(); //��ȡ����
L0_I2C_Ack(); //__/```\__
}
*(p + n - 1) = L0_I2C_ReceiveData();
L0_I2C_NoAck();
L0_I2C_Stop();
}
///////////////////////////////
///д��һ��reg Ϊ������д�������߶�ȡ����
void L1_I2C_WriteReg(unsigned char sla,unsigned char reg)
{
L0_I2C_Start(); //����I2C
L0_I2C_SendData(sla);//����������ַ
L0_I2C_SendData(reg);
}
// sla.(reg)=cmd
void L2_I2C_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd)
{
L1_I2C_WriteReg(sla,reg);
L0_I2C_SendData(cmd);
L0_I2C_Stop();
/*****************
if(gRccUs05 >0)///����iic��Ч�� ����û�н���
{
L0_uart0_uc(gRccUs05);gRccUs05 = 0;
}
***************/
}
//��ȡreg��ַ��n������ sla.(reg) sla.(reg+1)................ sla.(reg+n)
void L2_I2C_ReadReg(unsigned char sla,unsigned char reg,
unsigned char *r,unsigned char n)
{
// U8 d[1];
//S ADD W A REG A
L1_I2C_WriteReg(sla,reg);
//S ADD R A D1 A D2 A.....DX N P
L1_I2C_ReadNByte(sla,r,n);
}
#if 0////����ɾ��
///S 80H A Register Address A S 81H A Data NA P
void L2_tws_ReadReg000(unsigned char sla,unsigned char reg,
unsigned char *v)
{
unsigned char ack=8;
unsigned char BitCnt=8;//һ�ֽ�8λ
// U8 d[1];
//S ADD W A REG A
//// L1_I2C_WriteReg(sla,reg);
//step 1----
L0_I2C_Start(); //����I2C
//step 2----L0_I2C_SendData(sla);//����������ַ
//����SDA ������
for(BitCnt = 0;BitCnt < 8;BitCnt ++) //Ҫ���͵����ݳ���Ϊ8λ
{
if((sla << BitCnt ) & 0x80)
L0_I2C_SDA(1); //�жϷ���λ
else
L0_I2C_SDA(0);
L0_I2C_SCL(1); //��ʱ����Ϊ�ߣ�֪ͨ��������ʼ��������λ
L0_I2C_SCL(0);
}//8clk
L0_I2C_SDA(1); //8λ���������ͷ������ߣ�׼������Ӧ��λ
L0_I2C_SCL(1);
L0_I2C_SCL(0);
//step 3---L0_I2C_SendData(reg);
for(BitCnt = 0;BitCnt < 8;BitCnt ++) //Ҫ���͵����ݳ���Ϊ8λ
{
if((reg << BitCnt ) & 0x80)
L0_I2C_SDA(1); //�жϷ���λ
else
L0_I2C_SDA(0);
L0_I2C_SCL(1); //��ʱ����Ϊ�ߣ�֪ͨ��������ʼ��������λ
L0_I2C_SCL(0);
}//8clk
L0_I2C_SDA(1); //8λ���������ͷ������ߣ�׼������Ӧ��λ
L0_I2C_SCL(1);
L0_I2C_SCL(0);
//step 4----
L0_I2C_Start(); //����I2C
//step 5---
//����SDA ������
sla|=0x01;
for(BitCnt = 0;BitCnt < 8;BitCnt ++) //Ҫ���͵����ݳ���Ϊ8λ
{
if((sla << BitCnt ) & 0x80)
L0_I2C_SDA(1); //�жϷ���λ
else
L0_I2C_SDA(0);
L0_I2C_SCL(1); //��ʱ����Ϊ�ߣ�֪ͨ��������ʼ��������λ
L0_I2C_SCL(0);
}//8clk
L0_I2C_SDA(1); //8λ���������ͷ������ߣ�׼������Ӧ��λ
L0_I2C_SCL(1);
L0_I2C_SCL(0);
//step 6---receive data
//����SDA ������
*v = L0_I2C_ReceiveData();
L0_I2C_SCL(1);
L0_I2C_SCL(0);/// send NA
//step 7--- P
L0_I2C_Stop();
}
///S 80H A Register Address A S 81H A Data NA P
#endif