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
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�� ��
|
||
|
������ΪNA������������LSB֮����Ӧ���ͷ�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
|
||
|
|
||
|
|
||
|
|