질문"SPI는

S

sreejith

Guest
몇 가지 중 하나가 특정 응용 프로그램과 함께 자세히 SPI는 및 I2C의 차이를 줄 래요?어떻게 pic18f4550/4455와 구현 무엇입니까?

미리 감사드립니다

 
안녕
SPI는 4 선식 인터페이스를 선택하고 클록 신호를 된장, MOSI, 노예가됩니다.하지만 가능한 I2C SDA는 2 선식 인터페이스와 SCL입니다.만약 당신이 guarranteed 데이터 전송이 필요 SPI를 권장합니다.

가능한 I2C 함께 여러 장치에 연결할 때 사용하기 쉬운 이래 가지고 - 구성표를 해결 내장하고있습니다.

당신은 그물에 대한 자세한 문서를 얻을 수 ...

안녕

 
대부분의 응용 프로그램에서는 SPI와 같은 spo sdo 포트 inout 출력으로 신호를 제어하는 muxed 활성화됩니다.
당신은 인터넷에서 자신의 세부 사양을 얻을 수있습니다.
그게 다예요.

 
은 I2C 버스를 사용하여

내 이메일에서 볼 때, 꽤 I2C 버스는 매우 신인상 혼동을 줄 수 분명하다.나는 웹사이트에서 I2C 버스를 사용하여, 예제를 많이하지만, 이들 중 많은 높은 수준의 컨트롤러를 사용하는 실제 버스에 일이 일어나고 있는지 자세하게 표시되지 않습니다.따라서이 짧은 문서 드하려고 - I2C 버스 신비, 난 반대의 효과를하지 않기를 바래!

물리 I2C 버스
이것은 단지 두 개의 전선, SCL과 SDA는 호출됩니다.SCL 클럭 라인입니다.그것 I2C 버스에있는 모든 데이터를 전송을 동기화하는 데 사용됩니다.SDA는 데이터 라인입니다.SDA는 SCL & 라인 I2C 버스에있는 모든 장치에 연결되어있습니다.여기는 그냥 바닥 또는 0 볼트입니다 3 선식해야합니다.또한 5volt 선 수있습니다 전원 장치에 배포되고있습니다.두 SCL과 SDA는 라인 "오픈 드레인"드라이버입니다.이것이 의미하는 칩의 출력이 낮게 운전할 수있습니다 무엇입니까지만, 높은 운전 수없습니다.라인하면 풀다운을 제공해야합니다 높은 갈 수있을 저항을 5V 서플라이까지.저기 5V의 라인 SCL 라인에서 저항과 다른 SDA는 라인에서 5V의 라인에 있어야합니다.당신은 단 하나의 풀다운 저항 설정 전체 I2C 버스에 대한 최대, 아니 각 장치에 대한 아래 그림 필요합니다 :저항의 값은 중요하지 않습니다.난 (1800 옴) 47K로 (47000 옴)을 사용 1k8로부터 아무것도 보았다.1k8, 4k7와 10,000하는 일반적인 가치지만, 아무것도이 범위에서 확인 작업을해야합니다.이 당신이 최고의 성능을 제공합니다 내가 1k8하는 것이 좋습니다.만약 저항 실종, SCL과 SDA는 라인 - 언제나 거의 0 볼트 - 그리고이 작동하지 않습니다 I2C 버스 낮은 것입니다.

마스터스와 노예
I2C 버스에있는 장치 중 하나를 마스터 또는 노예가됩니다.마스터는 항상 SCL 클럭 라인 드라이브는 장치입니다.노예 장치가 마스터에 응답합니다.노예 I2C 버스에 전송을 시작할 수없는 경우에만 마스터 할 수있습니다.저기, 될 수 있으며 대개의 I2C 버스에 여러 개의 노예, 그러나 거기에 일반적으로 하나의 마스터입니다.여러 주인이 가능합니다,하지만 이례적인 일이다 그리고 여기에서 다루지 않은.귀하의 로봇에서 마스터 컨트롤러와 노예가 우리의 모듈 SRF08 또는 CMPS03 같이 될 거예요.노예 송금을 시작하지 않습니다.둘 다 마스터 및 슬레이브 I2C 버스 이상하지만, 데이터를 전송할 수있는 전송은 항상 마스터에 의해 제어됩니다.

가능한 I2C 물리적 프로토콜
언제 마스터 (컨트롤러)의 노예로 예를 들면)는 I2C 버스에 시작 순서를 발행함으로써 시작 (우리 CMPS03 얘기를 기원합니다.시작 순서를 한 두 가지 특수한 시퀀스 I2C 버스에, 다른 하나는 그만 순서를 정의 중 하나입니다.시작 순서 및 중지 순서대로 이러한 유일한 장소 SDA는 (데이터 라인) 동안 SCL (24 시간 라인) 고등학교를 변경할 수입니다 특별한있습니다.데이터가 전송되고, SDA는 안정적인 유지합니다 변경하지 하다니 SCL 높습니다.시작 및 중지 시퀀스를 시작 트랜잭션의 최종 슬레이브 장치로 표시합니다.데이터를 8 비트의 시퀀스로 전송됩니다.SDA는 비트 라인 MSB가 (가장 중요한 비트)와 함께 시작에 놓이게됩니다.SCL 라인을 누른 높은 누른 낮은 펄스입니다.그 칩은 정말 라인이 높은 운전 못해 기억, 그것을 단순히 ""그것이 실제로 높은 저항을 끌어 갈 수있습니다.모든 8 비트 전송 들어, 장치의 데이터를 다시 수신 비트 인정, 그래서 거기에 실제로 데이터의 각 8 비트 바이트를 전송하는 9 SCL 클럭 펄스 위치를 보냅니다.만약 수신 장치를 다시 ACK는 낮은 비트, 그러면 다른 바이트를 받아들일 준비가되어 데이터를 받았습니다 보냅니다.만약 다시이 높은 다음 그것을 마스터 중지 시퀀스를 전송하여 전송을 종료해야합니다 모든 추가 데이터를 받아들일 수 없다 나타내는 보냅니다.얼마나 빨리?
표준 클럭 (SCL) 가능한 I2C 속도를 최대 100KHz합니다.필립스는 빠른 속도를 어떻게 정의합니까 : 어느 400kHz와 3.4MHz까지이다 고속 모드로 최대 빠른 모드.우리의 모든 모듈의 최대 100KHz에서 작동하도록 설계되었습니다.우리는 최대 1MHz의지만이 작은 지체의 각 바이트 사이에 우리가 몇 가지 전송 요구를 우리가 모듈을 테스트했다.실용적인 로봇 있음, 우리는 모든 필요한 높은 SCL 속도를 사용하는 적이없습니다.잊어이나 100KHz 아래에 다음 SCL 유지.

가능한 I2C 장치 주소
모든 가능한 I2C 주소 중 7 비트 또는 10 비트입니다.10 비트 주소를 사용하고 희귀한 여기에 적용되지 않습니다.우리의 모든 모듈 및 7 비트 주소를 가지고 것입니다 사용 일반적인 칩.이것은 당신이 128 장치로 I2C 버스에 7bit 숫자는 0부터 127까지의 수있습니다 이후 최대 수있습니다.때는 7 비트 주소를 보내고, 우리는 여전히 항상 8 비트로 보내주십시오.여분의 비트를 마스터 그것에 서면 또는 그것을 읽는 노예 통보하는 데 사용됩니다.만약 비트가 0입니다 주인님의 노예로 쓰고있습니다.만약 비트가 1 마스터 슬레이브를 읽는 것입니다.7 비트 주소는 바이트와 읽기의 상위 7 비트에 배치됩니다 / 쓰기 (읽기 / 쓰기) 비트 LSB가 (최소 유효 비트)입니다.바이트의 상위 7 비트에서 7 비트 주소의 위치 신인상 혼란의 원천입니다.그것은 21의 주소에 쓸 즉, 당신은 실제로는 42을 보내야만이 21 일 이상의 1 비트로 이동합니다.아마 8 비트 주소로 I2C 버스 주소의 생각, 심지어 같은 단지 같은 장치에 대한 읽기 주소로 홀수 주소를 써주세요 주소가 쉽습니다.예를 들어, 우리가 CMPS03을 사용하려면,이 주소를 0xC0 ($ C0)에있습니다.당신은 것이라고 0xC0 the CMPS03를 작성하고 그것을 0xC1에서 읽기를 사용합니다.그래서 읽기 / 쓰기 비트 그냥 이상한 /도 주소가있습니다.

가능한 I2C 소프트웨어 프로토콜
그런 일이 일어날 것 우선 마스터 시작 순서를 보낼 것입니다.이 버스 트랜잭션을 시작하고 그들 까봐 그들을위한 들어야 모든 슬레이브 장치를 알려줍니다.다음 마스터 장치의 주소를 보내드립니다.그 트랜잭션이 계속이 주소와 일치하는 노예, 어떤 사람이 트랜잭션의 나머지는 무시하고 다음를 기다립니다.마스터 이제 내부의 위치 또는 그것을 작성하거나 읽을 소원을 노예로 안으로 등록 번호를 보내야만합니다 슬레이브 장치의 주소를 가졌어요.이 숫자는 분명히 노예가 실제로 그것이 얼마나 많은 내부 레지스터 무엇에 따라 다릅니다.일부는 아주 간단한 장치,하지만 아무것도 없어 대부분, 우리의 모든 모듈을 포함한 않습니다.번호 0-15 우리 CMPS03 16 위치하고있다.SRF08 36있다.데 가능한 I2C 주소와 내부 레지스터 이제 하나만 있어야되지 않습니다) (또는 바이트 데이터를 바이트를 보낼 수있는 마스터 주소로 보냈습니다.마스터 슬레이브 및 데이터 바이트를 보낼 수 각 바이트 이후에 노예가 있기 때문에 자동으로 증가 내부 레지스터 주소를이 일반적으로 다음과 같은 레지스터에 배치됩니다 계속할 수있습니다.언제 마스터 슬레이브에 대한 모든 데이터 쓰기 완료, 어떤 트랜잭션이 완료되면 중지 시퀀스를 보냅니다.그래서 노예 장치에 쓰기 :
1.시작 순서를 보내기
2.연구와 노예은 I2C 주소 보내기 / W의 비트 (도) 주소 낮은
3.당신이 글을 쓰고 싶어요 내부 레지스터 번호를 보내기
4.바이트의 데이터 전송
5.[선택 모든 추가 데이터 바이트를 보낼 수]
6.그만 순서를 보냅니다.

예를 들어, 당신은 0xE0의 공장 기본 주소에서 SRF08있습니다.SRF08 당신이 명령을 등록 0x51 0x00 이런식으로 쓰는 것이 이르기를 시작하려면 :
1.시작 순서를 보내기
2.연구와 SRF08의 (가능한 I2C 주소 / W의 비트 (도) 낮은 0xE0 주소 보내기
3.명령 레지스터 (내부 주소) 0x00 보내기
4.0x51 보내기 (명령)에 이르는 SRF08 시작
5.그만 순서를 보냅니다.

슬레이브에서 읽기
이것은 조금 더 복잡합니다 -하지만 너무 훨씬 더 많죠.슬레이브 장치에서 데이터를 읽기 전에, 당신은 그것을 얘기해야하는 당신이 읽고 싶어하는 자사의 내부 IP 주소의.그래서 노예를 읽고 실제로 그것에 작성을 시작합니다.이 때 당신이 그것을 쓰고 싶어 동일합니다 : 당신이 시작 순서를 보내려면, 연구와 노예은 I2C 주소 / W의 비트 (도)와 당신에게 글을 쓰고 싶어요 내부 레지스터 번호 주소 쌉니다.이제 또 다른 시작 순서를 보내려면 (가끔 다시 시작해야 함)와 가능한 I2C 주소를 다시 전화 - 읽기 비트를 설정하여이 시간.그런 다음 읽기 많은 데이터 바이트 네가하고 싶은대로 종료 트랜잭션 시퀀스를 중지합니다.그래서 CMPS03 모듈에서 바이트 베어링 나침반을 읽을 수 :
1.시작 순서를 보내기
2.연구와 CMPS03의 (가능한 I2C 주소 / W의 비트 (도) 낮은 0xC0 주소 보내기
3.베어링 레지스터의 (인터넷 주소) 0x01 보내기
4.다시 (반복 시작) 시작 순서를 보내기
5.연구와 CMPS03의 (가능한 I2C 주소 / W의 높은 비트 (홀수 주소) 0xC1 보내기
6.읽기는 데이터의 바이트 CMPS03
7.그만 순서를 보냅니다.

비트 시퀀스는 다음과 같이됩니다 :잠깐 만요
간단 가능한 I2C 통신을 거의 다,하지만 거기에 하나 더 복잡합니다.때 마스터 슬레이브에서 읽고, 그 노예는 SDA는 라인에 위치 데이터,하지만 그 시계는 컨트롤의 달인.어떤 경우에는 노예가 준비되지 않았습니다 데이터를 전송하는!디바이스 EEPROMs 등이 문제가 아니라 때 슬레이브 장치를 실제로 할 다른 것들과 마이크로 프로세서, 그것에 문제가있을 수있습니다.슬레이브 장치에 마이크로 프로세서를 가지 루틴, 작동 등록하기, 무슨 마스터 주소를 찾을 필요가 인터럽트에서 읽을 데이터의 전송이 등록에 집을 얻을 싶어.이것은 많은 반면 마스터 전엔 SCL 라인에 노예에 응답하지 않을 수있습니다 클럭 펄스를 보내는 일은 우리에게 걸릴 수있습니다.가능한 I2C 프로토콜이 솔루션을 제공합니다 : 노예 SCL 라인을 낮게 잡아 허용됩니다!이 시계는 스트레칭이라고합니다.노예 때 그것이 낮은 클럭 라인을 보유하고 마스터에서 읽기 명령을 가져옵니다.다음 요청된 데이터되면 마이크로 프로세서, 전송 레지스터에서 장소 및 클럭 라인을 마지막으로 높이 뽑아 풀다운 저항을 최대 허용을 출시하였습니다.보기의 주인이 시점에서, 그것 SCL 높은함으로써 그리고 만약 정말 높은 간 확인할 읽기의 첫 번째 클럭 펄스를 발행합니다.면, 아직도 그때의 노예가되기 전까지는 높은되면 계속하기 전에 그것을 마스터 낮은 낮은 들고 기다려야한다.다행히도 대부분의 마이크로 프로세서에 대한 하드웨어를 가능한 I2C 포트를 자동으로 처리됩니다.

그러나 가끔, 마스터 가능한 I2C 서브루틴 단지 컬렉션이며, 거기에 몇 가지 구현 거기서 완전히 무시하고 시계가 뻗어있다.그들은 같은 것들을 작업 EEPROM이의 노예가 아니라 마이크로 프로세서를 사용하는 시계가 뻗어있다.그 결과 잘못된 데이터를 슬레이브에서 읽을 수입니다.조심!

예제 마스터 코드
이 예제에서는, 클록 스트레칭을 포함한 소프트웨어를 가능한 I2C 마스터 구현하는 방법을 보여줍니다.이것은 C의 PIC 프로세서지만,는 I / O 핀 정의을 약간 변경하면 대부분의 프로세서에 적용되어야 작성된 것입니다.그것은 우리의 모든 가능한 I2C 기반의 로봇 모듈의 제어에 적합합니다.SCL과 SDA는 라인부터 오픈 드레인 유형입니다, 우리는 출력을 유지하는 출력을 제어하는 컨트롤을 등록 tristate를 사용하여 낮은 등록할 수있습니다.포트 핀은 여전히 읽을 수 있지만, 그래서 그들은 SCL_IN 및 SDA_IN로 정의해야합니다.이것은 정의와 초기화 아마 여러분 모두 서로 다른 프로세서에 대한 변경해야합니다.

SCL TRISB4 / / I2C 버스를 정의 #
SDA는 TRISB1 / 정의 # /
SCL_IN RB4 / 정의 # /
SDA_IN Rb1 / 정의 # /

포트를 초기화하려면 1이 출력을 비활성화하고 높은 저항으로 당길 수 있도록 tristate 레지스터를 0으로 출력 resisters 설정합니다.
SDA는 = SCL = 1;
SCL_IN = SDA_IN = 0;

우리는 I2C 버스에 확실히 시퀀스를주고 SDA는 SCL 변화와 사이에 작은 지연 루틴을 사용할 수있습니다.이것은 아무것도 서브루틴을 호출하고 반환 이상.
무효 i2c_dly (무효)
(
)

다음과 같은 4 원시 함수를 시작, 중지, 읽기 및 쓰기 시퀀스를 제공합니다.모든 가능한 I2C 이러한 거래에서 구축하실 수있습니다.
무효 i2c_start (무효)
(
SDA는 = 1; / / 가능한 I2C 시작 비트 시퀀스
i2c_dly ();
SCL = 1;
i2c_dly ();
SDA는 = 0;
i2c_dly ();
SCL = 0;
i2c_dly ();
)

무효 i2c_stop (무효)
(
SDA는 = 0; / / 가능한 I2C 중지 비트 시퀀스
i2c_dly ();
SCL = 1;
i2c_dly ();
SDA는 = 1;
i2c_dly ();
)

서명 숯불 i2c_rx (숯불 응답)
(
숯불 엑스, D 조 = 0;
SDA는 = 1;
(x = 0; x "8; x ) (
d 개 ""= 1;
할 (
SCL = 1;
)
반면 (SCL_IN == 0); / / 모든 SCL 클록 스트레칭을 기다려
i2c_dly ();
만약 (SDA_IN) d 개 | = 1;
SCL = 0;
)
만약 (응답) SDA는 = 0;
다른 SDA는 = 1;
SCL = 1;
i2c_dly (); / / (N)이 비트는 ACK를 보내
SCL = 0;
SDA는 = 1;
복귀 D 조;
)

비트 i2c_tx (서명 숯불 d)에
(
숯불 x;
고정 비트 b;
(x = 8, x, x -) (
만약 (D 조 &은 0x80) SDA는 = 1;
다른 SDA는 = 0;
SCL = 1;
d 개 ""= 1;
SCL = 0;
)
SDA는 = 1;
SCL = 1;
i2c_dly ();
b = SDA_IN; / / 가능성이 비트는 ACK
SCL = 0;
반환 b;
)

위의 4 원시적인 기능을 쉽게 작성 가능한 I2C 같이 트랜잭션을 양식에 넣어 수있습니다.여기에, 예를 들어 SRF08 센티미터에 이르는를 시작합니다 :

i2c_start (); / / 시작 순서를 보내려면
i2c_tx (0xE0); 연구와 / / SRF08 가능한 I2C 주소 / W의 비트 취소
i2c_tx (0x00); / / SRF08 명령을 등록 주소
i2c_tx (0x51); / / 명령 센티미터에 이르는 시작
(); / / 순서를 그만 보내 i2c_stop

지금에 이르기까지 완료하기 위해 기다리고 65mS 후에 (당신) 다음 예제 등록 방법 1 광 센서의 값을 레지스터 2 & 3 범위의 결과를 읽는 방법을 보여줍니다 떠났어요.

i2c_start (); / / 시작 순서를 보내려면
i2c_tx (0xE0); 연구와 / / SRF08 가능한 I2C 주소 / W의 비트 취소
i2c_tx (0x01); / / SRF08 광 센서 등록 주소
i2c_start (); / / 순서를 다시 보내려면
i2c_tx (0xE1); 연구와 / / SRF08 가능한 I2C 주소 / W의 비트가 설정된
lightsensor = i2c_rx (1); / / 얻을 조명 센서와 인정 보낼 수있습니다.내부 레지스터의 주소를 자동으로 증가됩니다.
rangehigh = i2c_rx (1); / / 범위의 높은 바이트 가서 인정 보낼 수있습니다.
rangelow = i2c_rx (0); 범위 / / 좀 낮은 바이트 - 우리가 마지막 바이트를 인정하지 않습니다.
(); / / 순서를 그만 보내 i2c_stop

쉽지 않아?

I2C 버스에 대한 최종 사양 필립스의 웹사이트에서 찾을 수있습니다.현재는 여기에 있지만 그 경우에는 당신이 그것을 쉽게 I2C 버스 사양 "에 googleing 될 찾을 이사".

 

Welcome to EDABoard.com

Sponsor

Back
Top