첫 번째 바이트가 좀 .. 안 다음 바이트 얻을

H

hhhsssmmm

Guest
Howdee 사람.

난 이야기가 사진을 가야 2 개의 I2C 인터페이스를 단지 완료 ...마스터 및 슬레이브 설정.

이것은 ...... 일을하지만 후 첫 번째 바이트를 가장 성공적으로 읽는 노예 것 PICS와 액정 표시의 마스터 .... 경우 다른 바이트를 읽기 요청 주인님은 다시에서 노예 .... 그때 두 잠글 ... 아니면 그런 것 같군 어쨌든 .... 그리고 난 노예에서 안 얻을받은 바이트를 더 이상.

그래서 짧은 나의 I2C 링크는 수신 바이트 작품을 처음 ... 최대 잠금 후에 어떤.

제발 문제를 수있는 사람이 도움을 해결하기 위해 내가 여기.

내 설정은 ...

) PIC18F4423 (석사) 및 PIC18F2420 (노예
마스터 @ 20MHz로 세라믹 시계
슬레이브 @ 8MHz 내부 클럭
컴파일러는 C18를 사용

아래는 노예의 마스터와 코드가 내 테스트.

감사합니다

hhhsssmmm
코드 :마스터 코드

--------------메인 (무효) 무효

(서명되지 않은 번째 문자 ABC는, 데프, HIJ; / / 바이트 잡고 변수ABC는 = read_from_slave_PIC은 (0xD0); / / 슬레이브 PIC는 (주소)에서 읽기데프 = read_from_slave_PIC은 (0xD0); / / 슬레이브 PIC는 (주소)에서 읽기HIJ = read_from_slave_PIC은 (0xD0); / / 슬레이브 PIC는 (주소)에서 읽기/ / 인쇄 첫 번째 바이트

SendLCD은 (0x80으로, 0); / / 라인 1 액정 활성화 ...
1 열

/ / LCD에 데이터 바이트를 인쇄

SendLCD (1 ABC 방송);Delay10KTCYx (125); / / 지연 시간 250ms/ / 인쇄 두 번째 바이트

SendLCD은 (0x81, 0); / / 라인 1 액정 활성화 ...
2 열

/ / LCD에 데이터 바이트를 인쇄

SendLCD (데프, 1);Delay10KTCYx (125); / / 지연 시간 250ms/ / 인쇄 제 3 BYTE

SendLCD은 (0x82, 0); / / 라인 1 액정 활성화 ...
3 열

/ / LCD에 데이터 바이트를 인쇄

SendLCD (HIJ, 1);(1) 동안; / / 루프 영원히의) / / 끝 주 ()
서명되지 않은 번째 문자 read_from_slave_PIC (서명 번째 문자 주소)

(서명되지 않은 번째 문자 data_byte = 0; / / 변수는 슬레이브에서 데이터 바이트를 개최OpenI2C은 (); / / INITIALLIZE 및 I2C 포트를 구성StartI2C은 (); / /가 시작 I2C 조건을 생성IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지버퍼가 비어있는 경우 / / 진행 (DataRdyI2C () == 0)하는 경우

(노예로 / / 보내기 WIRTE 명령 ...
LSB가이 '0 '이 비트를 써 있습니다/ / ACK는이 노예에서 접수되지 않아 (WriteI2C (주소) == 0)하는 경우

(I2C_Error (); / / 중지하고 휴식 I2C PICS 사이의 연결이 실패하는 경우(1) 동안; / / 중지 프로그램)IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지)StopI2C은 (); / / 정지 I2C 조건을 생성IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지StartI2C은 (); / /가 시작 I2C 조건을 생성IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지버퍼가 비어있는 경우 / / 진행 (DataRdyI2C () == 0)하는 경우

(노예로 / / 보내기 읽기 명령 ...
LSB가가 '1 '비트로 읽기입니다/ / ACK는이 노예에서 접수되지 않아 (WriteI2C (주소 1) == 0)하는 경우

(I2C_Error (); / / 중지하고 휴식 I2C PICS 사이의 연결이 실패하는 경우(1) 동안; / / 중지 프로그램)IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지)data_byte = ReadI2C (); / / 슬레이브로부터받은 데이터를 읽어NotAckI2C은 (); / / 데이터를 읽은 후에 안 아야 조건을 생성StopI2C은 (); / / 정지 I2C 조건을 생성IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지반환 data_byte; / / 반환 데이터를 슬레이브에서 바이트read_from_slave_PIC의) / / 끝 ()OpenI2C을 (무효) 무효

(/ / 재설정 MSSP 등록

SSPCON1 = 0x00; 상태에 / / 전원

SSPCON2 = 0x00; / / 전원 상태에/ / 선택 및 I2C 마스터 모드 구성

SSPCON1bits.SSPM3 = 1;

SSPCON1bits.SSPM2 = 0;

SSPCON1bits.SSPM1 = 0;

SSPCON1bits.SSPM0 = 0;

SSPSTATbits.SMP = 1; / / 슬루율 정상 속도 @ 100kHz로 설정

SSPADD = 0x63은; / / 전송 속도를 100kHz을 (정상) 설정 ... PIC를 실행하고 @ 20MHz로를

SSPSTATbits.CKE = 0; / / 비활성화 SMBus는

PIR1bits.SSPIF = 0; / / 리셋 MSSP 인터럽트 플래그 비트SSPCON1bits.SSPEN = 1; / / 사용 I2C 마스터 포트의) / / 끝 OpenI2C ()NotAckI2C을 (무효) 무효

(SSPCON2bits.ACKDT = 1; / / 설정되지 않음 ACK는 비트에 대한 인정SSPCON2bits.ACKEN = 1; / / 버스를 발사 인정의) / / 끝 NotAckI2C ()IdleI2C을 (무효) 무효

(/ / 테스트 및 기다려야 I2C 모듈이 유휴 상태가 될 때까지

((SSPCON2 & 0x1F) | 동안 (SSPSTATbits.R_W))계속; / / 유휴 때까지 계속 루핑의) / / 끝 IdleI2C ()서명되지 않은 번째 문자 DataRdyI2C (무효)

((SSPSTATbits.BF == 1) / / 테스트 버퍼 풀 비트가 설정되어있는 경우반환 1; SSPBUF에 / / 데이터 등록다른 사람반환 0; / / SSPBUF에 데이터 등록의) / / 끝 DataRdyI2C ()서명되지 않은 번째 문자 ReadI2C (무효)

(SSPCON2bits.RCEN = 1; / 1 바이트 수신을위한 마스터를 활성화 /SSPSTATbits.BF은 == 0); / / 바이트 때까지 기다려야 (동안받은PIR1bits.SSPIF은 == 0); / / 기다리는 (동안 인터럽트PIR1bits.SSPIF = 0; / / 리셋 MSSP 인터럽트 플래그 비트SSPBUF을 반환합니다; 읽기 / / 반환을 바이트의) / / 끝 ReadI2C ()서명되지 않은 번째 문자 WriteI2C (서명 번째 문자 data_out)

(SSPCON2bits.ACKSTAT = 1; / / 다시는 ACK 비트 플래그SSPBUF = data_out가; / / SSPBUF 단일 바이트 쓰기(SSPCON1bits.WCOL == 1) / / 쓰기 테스트하는 경우 충돌이 발생하는 경우

(SSPCON1bits.WCOL = 0; / / 재설정 충돌 비트주기를 쓰기 전까지는 SSPSTATbits.BF == 1); / / 잠깐 (동안 완료)PIR1bits.SSPIF은 == 0); / / 기다리는 (동안 인터럽트PIR1bits.SSPIF = 0; / / 리셋 MSSP 인터럽트 플래그 비트SSPCON2bits.ACKSTAT은 == 0) / / 거기는 ACK습니까 (해당되는 경우 DS1307에서 보냈나요?반환 1; / / ACK는 DS1307을 유도다른 사람반환 0; / / 아뇨 ACK는 보냈습니다의) / / 끝 WriteI2C ()StartI2C을 (무효) 무효

(SSPCON2bits.SEN = 1; / / 초기화를 시작 조건PIR1bits.SSPIF은 == 0); / / 기다리는 (동안 인터럽트PIR1bits.SSPIF = 0; / / 리셋 MSSP 인터럽트 플래그 비트의) / / 끝 StartI2C ()StopI2C을 (무효) 무효

(SSPCON2bits.PEN = 1; / / 생성 중지 상태PIR1bits.SSPIF은 == 0); / / 기다리는 (동안 인터럽트PIR1bits.SSPIF = 0; / / 리셋 MSSP 인터럽트 플래그 비트의) / / 끝 StopI2C ()I2C_Error을 (무효) 무효

(IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지StopI2C은 (); / / 정지 I2C 조건을 생성IdleI2C (); / / 루프 I2C 버스가 유휴 상태가 될 때까지I2C_Error의) / / 끝 ()노예 코드

------------메인 (무효) 무효

(/ / 재설정 MSSP 등록

SSPCON1 = 0x00; 상태에 / / 전원

SSPCON2 = 0x00; / / 전원 상태에시작 및 정지 비트 / / I2C 슬레이브 모드, 7 비트 주소, 인터럽트 활성화

SSPCON1bits.SSPM3 = 1;

SSPCON1bits.SSPM2 = 1;

SSPCON1bits.SSPM1 = 1;

SSPCON1bits.SSPM0 = 0;

SSPSTATbits.SMP = 1; / / 슬루율 정상 속도 @ 100kHz로 설정

SSPADD = 0xD0가; / / 슬레이브 주소 (7bit)입니다.
LSB가의 R / W의 플래그 비트입니다

SSPSTATbits.CKE = 0; / / 비활성화 SMBus는SSPCON1bits.CKP = 1; / / 시계 출시SSPCON1bits.SSPEN = 1; / / 사용 I2C 마스터 포트SSPCON1bits.SSPOV = 0; / / 지우기 버퍼 오버플로PIR1bits.SSPIF = 0; / / 리셋 MSSP 인터럽트 플래그 비트INTCONbits.INT0IF = 0; / / INT0 외부 인터럽트 플래그 비트를 리셋INTCON은 = 0b10010000; / / 모든 우선 순위가 높은 인터럽트를 활성화

/ / 인터럽트는 주변 장치를 모두 낮은 우선 순위를 비활성화

/ / 해제 TMR0 오버플로 인터럽트

/ /이 INT0 외부 인터럽트를 활성화

/ / 비활성화 RB 포트 변화 인터럽트D0 = SSPBUF가; / / BF를 지웁니다D0 = 'R은'; / / 할당 데이터를 마스터에 전송하는 바이트(1) 동안; / / 루프 영원히의) / / 끝 주 ()HighInterrupt을 (무효) 무효

((해당되는 경우 PIR1bits.SSPIF == 1) / /면 방해 MSSP

((해당되는 경우 SSPSTATbits.S == 1) / / 슬레이브는 / 데이터 후에 시작 주소를받습니다

((마스터에서 SSPSTATbits.R_W == 1) / / 읽기 요청하는 경우

(SSPBUF = D0; / /로드 데이터 전송을위한 바이트SSPCON1bits.CKP = 1; / / 출시 SCL 라인 전송 시작BF는 해결이 될 때까지 SSPSTATbits.BF는 == 1); / 여기 있어요 / (하면서)/ / 마스터에서 데이터를 수신

SSPSTATbits.D_A은) / / 데이터 [이]가 해결되지 == 1 (해당되는 경우D3 = SSPBUF가; / / 데이터를 얻을 수)SSPSTATbits.BF은 == 1) / / 버퍼가 가득 찬 것입니다 (만약 그렇다면 그것을 빈d4로 = SSPBUF가; / / 취소 플래그로 버퍼를 읽어PIR1bits.SSPIF = 0; / / 리셋 MSSP 인터럽트 플래그 비트)높음 ISR이의) / / 끝

 

Welcome to EDABoard.com

Sponsor

Back
Top