마이크로 칩의 데이터 시트에 따라 I²C 마스터 쓰기 기능을 직접 작성하고 있습니다. 나는 재미있는 비트를 내가 코드 설정 프로그램으로 구성을 생성 MPLAB의 X를 사용하지만, 현재 해요 : I²C 마스터 PIC18F45K50 쓰기 : SCL을 낮게 유지
// R_nW write_noTX; P stopbit_notdetected; S startbit_notdetected; BF RCinprocess_TXcomplete; SMP Standard Speed; UA dontupdate; CKE disabled; D_nA lastbyte_address;
SSP1STAT = 0x80;
// SSPEN enabled; WCOL no_collision; CKP Idle:Low, Active:High; SSPM FOSC/4_SSPxADD_I2C; SSPOV no_overflow;
SSP1CON1 = 0x28;
// SBCDE disabled; BOEN disabled; SCIE disabled; PCIE disabled; DHEN disabled; SDAHT 100ns; AHEN disabled;
SSP1CON3 = 0x00;
// Baud Rate Generator Value: SSP1ADD 80;
SSP1ADD = 0x50;
// clear the master interrupt flag
PIR1bits.SSP1IF = 0;
// enable the master interrupt
PIE1bits.SSP1IE = 1;
그래서 : 표준 속도, 100ns의 시간을 잡고, 마스터 모드, 50kHz의 약 clokck 주파수를.
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#define _XTAL_FREQ 16000000
#define RTS_PIN PORTDbits.RD3
#define CTS_PIN PORTDbits.RD2
#define LED_PIN PORTAbits.RA1
#define RX_FLAG PORTAbits.RA2
uint8_t c;
// Define putch() for printf())
void putch(char c)
{
EUSART1_Write(c);
}
void main(void)
{
// Initialize the device
SYSTEM_Initialize();
while (1)
{
// Generate a START condition by setting Start Enable bit
SSP1CON2bits.SEN = 1;
// Wait for START to be completed
while(!PIR1bits.SSPIF);
// Clear flag
PIR1bits.SSPIF = 0;
// Load the address + RW byte in SSP1BUF
// Address = 85 ; request type = WRITE (0)
SSP1BUF = 0b10101010;
// Wait for ack
while (SSP1CON2bits.ACKSTAT);
// Wait for MSSP interrupt
while (!PIR1bits.SSPIF);
// Load data (0x11) in SSP1BUF
SSP1BUF = 0x11;
// Wait for ack
while (SSP1CON2bits.ACKSTAT);
// Generate a STOP condition
SSP1CON2bits.PEN = 1;
// Wait for STOP to be completed
while(!PIR1bits.SSPIF);
// Clear flag
PIR1bits.SSPIF = 0;
// Wait for 1s before sending the next byte
__delay_ms(1000);
}
}
슬레이브 장치가 나는 또 다른 아두 이노 (마스터)로 테스트 한 아두 이노입니다 : 여기 http://ww1.microchip.com/downloads/en/DeviceDoc/30000684B.pdf
내 코드입니다 :
나는 과정이 데이터 시트의 p238을 설명 따르도록 시도 제대로 작동하는지 확인하십시오.내 문제는 : 로직 애널라이저를 사용하여 SDA/SCL 신호를 분석 할 때 PIC를 시작할 때 정확한 주소를 보내고 바이트를 전송하지만 2 번째 SCL이 끝나면 LOW 이는 다른 모든 글을 나쁜 것으로 만듭니다 (SCL이 LOW로 유지되면 적절한 START 조건을 가질 수 없음). BTW는 첫 번째 전송이 끝날 때 SCL을 3ms 동안 로우로 유지하지만 아무런 이유없이 다시 하이로 전환됩니다.
내가 잘못하고있는 부분을 지적해도 될까요? 내가 뭔가 잊었 니?
고지.
감사합니다.
에릭
PS : 마스터와 같은 다른 아두 이노와 슬레이브를 테스트 할 때, SCL이 즉시 전송이 끝난으로 HIGH 설정됩니다.
그냥 내가 "안녕하세요"내 메시지를 시작하는 것을 잊었다 것으로 나타났습니다, 예의의 부족 죄송합니다 ... – ricothebrol