51 단편기 소프트웨어 시뮬레이션 IIC
/*==========================================================================
이름: IIC 프로토콜
내용: 함수는 소프트웨어가 시간을 지연시키는 방법으로 SCL 펄스를 생성하고 고결정 주파수에 대해 일정한 수정을 해야 한다
(이 예는 1us 기계 주기, 즉 크리스털 주파수는 12MHZ보다 작다)
============================================================================*/
#include
#include "iic.h"
bit ack;
/*=================================================
부팅 버스
==================================================*/
void iic_start()
{
SDA = 1;//시작 조건의 데이터 신호를 보내다
SCL = 1;
delay_us(1);//시작 조건 설정 시간 4.7us 이상, 지연 시간
SDA = 0;//시작 신호를 보내다
delay_us(1);//시작 조건 잠금 시간이 4 이상입니다.μ
SCL = 0;//I2C 버스 연결 및 데이터 전송 준비
}
/*=================================================
버스 종료
==================================================*/
void iic_stop()
{
SDA = 0;//종료 조건의 데이터 신호를 보내다
SCL = 1;
delay_us(1);//종료 조건 설정 시간이 4 보다 많음μ
SDA = 1;//I2C 버스 종료 신호 보내기
delay_us(1);
SCL = 0;
}
/*=====================================================================
바이트 데이터 보내기
함수 원형:bit iicsend_byte(unsigned char byte);
기능: 데이터byte를 보내면 주소일 수도 있고 데이터일 수도 있습니다. 보내면 응답을 기다리고
이 상태 비트는 작동합니다.(불응답 또는 비응답 모두ack=0 가짜)
데이터를 정상적으로 보내고ack=1;ack=0은 피제어기가 응답하지 않거나 손상되었음을 나타낸다.
======================================================================*/
bit iic_send_byte(unsigned char byte)
{
unsigned char i;
for(i=0;i <8;i++)//전송할 데이터 길이 8비트
{
SDA = byte & 0x80;//발송 위치를 판단하다
SCL = 1;//시계선을 높게 설정하면 컨트롤러가 데이터 위치를 수신하기 시작할 것을 알립니다
delay_us(1);//클럭의 높은 레벨 주기가 4 이상이어야 함μ
SCL = 0;
byte <<= 1;
}
SCL = 1;
SDA = 1;//8비트 발송 후 데이터 라인 방출, 응답 비트 수신 준비
delay_us(1);
if(0=SDA)//응답 신호 수신 여부 판단
{
ack = 1;
}
else
{
ack = 0;
}
SCL = 0;
return ack;
}
/*===================================================================================
바이트 데이터 수락
함수 원형: unsigned char iicreceive_byte();
기능: 부품에서 전송된 데이터를 수신하고 버스 오류(응답 신호를 보내지 않음)를 판단하는 데 사용되며, 발송 후 응답 함수를 사용하십시오.
====================================================================================*/
unsigned char iic_receive_byte()
{
unsigned char i;
unsigned char a;
unsigned char temp = 0;
SDA = 1;//데이터 라인을 입력 방식으로 설정
for(i = 0; i < 8; i++)
{
SCL = 0;//시계선을 낮추어 데이터 위치를 수신할 준비를 하다
delay_us(1);//시계의 저전기 평주기는 4.7us보다 크다
SCL = 1;//시계선을 높게 설정하여 데이터 라인의 데이터를 유효하게 하다
if(SDA)
{
a = 1;
}
else
{
a = 0;
}
temp |= (a << (7 - i));//데이터 비트를 읽고 수신한 데이터 비트를retc에 넣기
delay_us(1);
}
SCL = 0;
return temp;
}
/*===============================================================
응답 서브 함수
================================================================*/
void iic_ack()
{
SDA = 0;
SCL = 1;
delay_us(1);//클럭 저전력 주기가 4보다 큽니다.μ
SCL = 0;//계속 수신할 수 있도록 시계선을 정리하고 I2C 버스를 집어넣다
}
/*================================================================
비응답 서브 함수
=================================================================*/
void iic_noack()
{
SDA = 1;
SCL = 1;
delay_us(1);//클럭 저전력 주기가 4보다 큽니다.μ
SCL = 0;//계속 수신할 수 있도록 시계선을 정리하고 I2C 버스를 집어넣다
}
/*===========================================================================================
하위 주소 부품에 다자 바이트 데이터 함수 보내기
함수 원형:bit iicsend_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len);
기능: 시작 버스에서 발송 주소, 하위 주소, 데이터까지 버스의 전 과정을 끝냅니다.
부품 주소 sla, 하위 주소suba에서 발송 내용은str가 가리키는 내용으로len 바이트를 발송합니다.
1로 돌아가면 작업이 성공했음을 나타냅니다. 그렇지 않으면 작업이 잘못되었습니다.
참고 사용 전에 버스가 종료되어야 합니다.
=============================================================================================*/
bit iic_send_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len)
{
unsigned char i;
iic_start();//부팅 버스
iic_send_byte(sla);//부품 주소 보내기
if(0 == ack)
{
return ERR;
}
iic_send_byte(suba);//부속품 부속품 주소 보내기
if(0 == ack)
{
return ERR;
}
for(i = 0; i < len; i++)
{
iic_send_byte(*str);//데이터를 보내다
delay_us(1);//칩 내부 자동 처리 데이터 완료 대기 시간 지연
if(0 == ack)
{
return ERR;
}
str++;
}
iic_stop();//버스 종료
return SUCC;
}
/*===========================================================================================
하위 주소 부품에 다자 바이트 데이터 함수 읽기
함수 원형:bit iicreceive_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len);
기능: 시작 버스에서 발송 주소, 하위 주소, 데이터 읽기, 버스의 전 과정을 끝냅니다.
부품 주소 sla, 하위 주소 suba에서 읽은 내용을str가 가리키는 저장소에 넣고len 바이트를 읽습니다.
1로 돌아가면 작업이 성공했음을 나타냅니다. 그렇지 않으면 작업이 잘못되었습니다.
참고 사용 전에 버스가 종료되어야 합니다.
=============================================================================================*/
bit iic_receive_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len)
{
unsigned char i;
iic_start();//부팅 버스
iic_send_byte(sla);//부품 주소 보내기
if(0 == ack)
{
return ERR;
}
iic_send_byte(suba);//부속품 부속품 주소 보내기
if(0 == ack)
{
return ERR;
}
iic_start();
iic_send_byte(sla + 1);
if(0 == ack)
{
return ERR;
}
for(i = 0; i < len - 1; i++)
{
*str = iic_receive_byte();//데이터를 보내다
iic_ack();//보내면 바로 대답하기
str++;
}
*str = iic_receive_byte();
iic_noack();//비응위 보내기
iic_stop();//버스 종료
return SUCC;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.