세 가지 학습 EMC 마이크로 컨트롤러

아날로그 I2C --- 슬레이브


  하드웨어 플랫폼 : em78p153
       일반 IO 시뮬레이션에는 인터럽트 또는 쿼리의 두 가지 방법이 있습니다. 여기에서는 쿼리 방법이 사용됩니다. IO 포트의 상태 변경을 쿼리하면 호스트의 SCK 속도가 100Khz를 초과 할 수 없습니다.

     I2C 프로토콜에서 가장 중요한 점은 I2C 주소입니다. 이 주소에는 7 비트와 10 비트의 두 가지 형식이 있습니다. 7 비트는 127 개 주소를 나타낼 수 있으며, 실제 사용시 기본적으로 탑재 된 설정이 많지 않아 많은 장치 주소가 7 비트를 사용하므로이 기사의 나머지 부분은이를 기반으로합니다. I2C는 또한 "마스터-슬레이브"라는 매우 중요한 개념을 가지고 있습니다. 슬레이브 장치의 경우 데이터를 자동으로 보내는 것은 물론 아무것도하지 않습니다. 마스터 장치의 경우 제어 역할을하며 모든 것이 시작됩니다.


*********

타이밍 다이어그램을보고 몇 가지 요점을 요약하십시오.

1. 타이밍 다이어그램은 모두 클럭 신호를 공유하므로 상단 및 하단 다이어그램의 해당 클럭 신호에주의하십시오.

2. 타이밍 차트에 교차 또는 상승 또는 하락이 있으면 데이터가 변경된 것입니다. 다이아몬드로 묶인 세그먼트는 유효한 데이터를 나타냅니다.

3. 데이터는 일정 시간 동안 안정되어야하며 일반적으로 데이터가 변경된 후 클럭의 상승 또는 하강 에지에서 데이터를 읽거나 씁니다.

**********

이것은 슬레이브 머신이므로 마스터를 사용하여 슬레이브 머신을 읽고 쓰면 타이밍을 반대로 할 수 있습니다 .AT24C02의 타이밍을 확인할 수 있습니다. 

슬레이브로 작업 할 때는 시간 순서에 따라 역순으로해야합니다. 모드 IO 포트 쿼리 모드
를 슬레이브가 판단 할 이벤트로 사용합니다.


- 시작 -> 어드레스 일치 검출> 호스트 작성하는 것, 읽거나


  상기 ACK를 전송 -> 데이터를 수신하는 기록의 경우를 -> 데이터가 수신되었는지, 또는 호스트에 대한 대기는 NACK 전송을 중지 > - 호스트 정지


  을 작업을 읽어 ACK를 보내기 -> 송신 데이터 -> 호스트 ACK에 대한 대기가 -> 호스트 ACK 후 전송 계속 호스트 NACK이 STOP를 들어, 대기 전송을 중단 -> 호스트 STOP

MCU : 8Mhz 내부 IRC

암호

--- 코드는 테스트되었지만 이러한 종류의 쉽게 차단 된 읽기 및 쓰기는 그다지 효율적이지 않습니다. 이것은 참고 용입니다.

Date_0000 :; 시작 신호 수신 -------------------   
      MOV A, @ 0X03; 0.25us 1 명령주기
      IOW
PORT5 ; sda 입력 모드        Date_0001 :
      ; ---- ----------------------------------------
      JBS PORT5, SCL; scl == 1 판사 ? 2 명령 사이클
      JMP Date_0001; 아니오, 시작 신호
      재판정 1us 2 명령 사이클 JBS PORT5, SDA; Judge sda ​​== 1 1us
      JMP Date_0001;
Date_0002 :
      JBC PORT5 , SDA; 예, sda가 0과 같을 때까지 기다립니다 1us
      JMP $ -1;
      JBS PORT5, SCL; scl이 1과 같은지 결정
      JMP Date_0000; 아니오, 시작 신호 재판정 1us        
주소 :
Date_1000 :
       CLR REG0
       MOV A, @ 8
       MOV REG1, A;
       yr1 1us BC R3,0에 값 할당 ; c 캐리 플래그
Date_1100 지우기 :; 명령 수락 -------------------- --------           
      JBC PORT5, SCL; scl이 0으로 변경 될 때까지 기다립니다 1us
      JMP $ -1
      ; ======================= == =================        
      JBS PORT5, SCL; scl이 1
      JMP 로 변경 될 때까지 기다림 $ -1; scl의 상승 에지에서 데이터 입력 1us로 sda 사용
      ; ======== ==================================      
      RLC REG0; 하나 이동 비트를 왼쪽으로 이동하여
      JBC PORT5, SDA 에서 최고 값을 이동합니다 . sda 판사는 0 1us
      BS REG0,0과 같음; 1과 같음, 1 세트
      DJZ REG1, sda가 0, yr1-1이 0인지 판단
      JMP SID_1100, yr1 이 0 이 아님, 다음 비트 수락 1us
      MOV A, REG0         
      XOR A, @ 0Xa0, 데이터가 0xA0인지 판단
      3us JBS R3,2
      JMP Date_0000 ; 시작 신호를 다시 수락하지 않음
응답 :
Date_1200 :                    
      MOV A, @ 0X01
      ; IOW PORT5; sda 출력 모드       
      JBC PORT5, SCL; scl이 0이 될 때까지 기다림
      JMP $ -1            
      IOW PORT5 
      BC PORT5, SDA; 출력 0 
      JBS PORT5 , SCL; scl 변경 대기
      JMP $ -1
      JBC PORT5, SCL; scl 변경 대기 0
      JMP $ -1
무응답 :
Date_6500 :; Non-response ---- Slave sda ​​= 1
      MOV A, @ 0X01
      JBC PORT5, SCL; scl이 0이 될 때까지 기다림
      JMP $ -1;
      IOW PORT5; sda 출력 모드
      BS PORT5, SDA       
      JBS PORT5, SCL ; scl 대기 1
      JMP $ -1
      JBC PORT5, SCL; scl 0 변경 대기
      JMP $ -1        

stop :
Date_7000 :; stop signal -------------
      MOV A, @ 0X03
      IOW PORT5
      JBS PORT5          , SCL; scl이 1인지 확인
      JMP Date_7000
      JBC PORT5 , SDA, sda가 0인지 확인
      JMP Date_7000
      JBS PORT5 , SDA, sda가 1이 될 때까지 기다 립니다 .
      JMP $ -1 
      JBS PORT5, SCL; SDA = 1, scl이 1인지 판단
      JMP Date_7000 


추천

출처blog.csdn.net/u013830926/article/details/68943016