I/O 포트 에뮬레이션 I2C 드라이브 코드
헤더 파일 I2C.H :
#ifndef _I2C_H
#define _I2C_H
//
void I2C_Initial(void);
void I2C_Set_sda_high(void);
void I2C_Set_sda_low (void);
void I2C_Set_sck_high(void);
void I2C_Set_sck_low (void);
BYTE I2C_GetACK(void);
void I2C_SetACK(void);
void I2C_SetNAk(void);
void I2C_START(void);
void I2C_STOP(void);
void I2C_TxByte(BYTE);
BYTE I2C_RxByte(void);
BYTE WriteSingleByte(BYTE nAddr,BYTE nValue);
BYTE PageWrite(BYTE nAddr,BYTE *pBuf);
BYTE ReadRandom(BYTE nAddr, BYTE *nValue);
BYTE ReadSeq(BYTE nAddr,BYTE *nValue,BYTE nLen);
#endif
소스 파일 I2C.C :
/*******************************************************************************
* (C)2007,XXXXXXXX。
*
* :XXXXXX
* :
* :
* :
* :1.0
* :XXXX
* :XXXX XX XX
*
* 1:
* :
* :
* :
* :
* 2:…
*******************************************************************************/
/*******************************************************************************
//
*******************************************************************************/
#include "AX5051_subject.h"
#include "AX5051_Registers.h"
#include "AX5051_device.h"
/*******************************************************************************
//
*******************************************************************************/
/*******************************************************************************
//
*******************************************************************************/
/*******************************************************************************
* :I2C_Set_sda_low
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_Set_sda_low(void)
{
RTC_I2C_CMD_PxDIR |= SDA; // SDA
RTC_I2C_CMD_PxOUT &= ~(SDA); //SDA
_NOP();
_NOP();
}
/*******************************************************************************
* :I2C_Set_sda_high
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_Set_sda_high( void )
{
RTC_I2C_CMD_PxDIR |= SDA; // SDA
RTC_I2C_CMD_PxOUT |= SDA; //SDA
_NOP();
_NOP();
}
/*******************************************************************************
* :I2C_Set_sck_high
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_Set_sck_high( void )
{
P4OUT |= SCL; //SCL
_NOP();
_NOP();
}
/*******************************************************************************
* :I2C_Set_sck_low
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_Set_sck_low ( void )
{
P4OUT &= ~(SCL); //SCL
_NOP();
_NOP();
}
/*******************************************************************************
* :I2C_STOP
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_STOP(void)
{
BYTE i;
I2C_Set_sck_low();
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_high();
}
/*******************************************************************************
* :I2C_Initial
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_Initial( void )
{
RTC_I2C_CMD_PxDIR |= WP; //
P4OUT &= ~(WP);
RTC_I2C_CMD_PxDIR |= SCL; // SCL (P4.6)
I2C_Set_sck_high();
I2C_STOP();
}
/*******************************************************************************
* :I2C_START
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_START(void)
{
BYTE i;
I2C_Set_sda_high();
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_low();
}
/*******************************************************************************
* :I2C_GetACK
* :
* :
* :
* :
* :
*******************************************************************************/
BYTE I2C_GetACK(void)
{
BYTE nTemp = 0;
BYTE j;
_NOP();
_NOP();
I2C_Set_sck_low();
for(j = 10;j > 0;j--);
RTC_I2C_CMD_PxDIR &= ~(SDA); // SDA
_NOP();
_NOP();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
nTemp = P4IN & SDA; //
I2C_Set_sck_low();
return (nTemp);
}
/*******************************************************************************
* :I2C_SetACK
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_SetACK(void)
{
BYTE j;
I2C_Set_sda_low();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
I2C_Set_sck_low();
}
/*******************************************************************************
* :I2C_SetNAk
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_SetNAk(void)
{
BYTE j;
I2C_Set_sda_high();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
I2C_Set_sck_low();
}
/*******************************************************************************
* :I2C_TxByte
* :
* :
* :
* :
* :
*******************************************************************************/
void I2C_TxByte(BYTE nValue)
{
BYTE i;
BYTE j;
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
if(nValue & 0x80)
I2C_Set_sda_high();
else
I2C_Set_sda_low();
nValue <<= 1;
for(j = 10;j > 0;j--);
I2C_Set_sck_high();
}
}
/*******************************************************************************
* :I2C_RxByte
* :
* :
* :
* :
* :
*******************************************************************************/
BYTE I2C_RxByte(void)
{
BYTE nTemp = 0;
BYTE i;
BYTE j;
RTC_I2C_CMD_PxDIR &= ~(SDA); // SDA
_NOP();
_NOP();
_NOP();
_NOP();
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
for(j = 10;j > 0;j--);
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
if(P4IN & SDA)
{
nTemp |= (0x80 >> i);
}
}
I2C_Set_sck_low();
return nTemp;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
DPC 사용 방법DPC는 DeferredProcedureCall입니다. 말 그대로 일정 시간 후에 특정한 절차나 함수를 호출합니다. 만약 일정 시간 간격을 두고 자신이 쓴 함수를 실행하고 싶다면, 우리는 DPC를 사용할 수 있고, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.