본문 바로가기
임베디드.일렉트로닉스

I2C Master 설정법. 싸이프레스 pSoC/pRoC 의 SCB(Serial Communication Block)

by 리치굿맨 2015. 6. 13.

 

 

 

개요

 

 

 

싸이프레스사의  pSoC, pRoC  SCB (Serial Communication Block) 은 I2C, SPI, UART로 설정 가능하다. 

본 글에서는 SCB 로 I2C Master 로 설정하고 펌웨어 코드에서 기본코드 작성하는 법 정리한다.

 

1. 프로젝트의 스키메틱 (확장자 .cysch) 에서 SCB 배치하고 I2C Master 로 기능하도록 속성설정.

2. 펌웨어 코드에서 상기1의  SCB 모듈을 사용가능하도록 기본 코드 추가.

3. I2C 버스에서 지정된 슬레이브로 데이터 송수신  함수 사용법.

 

본 글 설명에서 사용된 칩과  IDE.

사용되는 타겟칩 : CYBL10162

개발IDE : pSoC Creator 3.2

 

 

 

 

 

 

1. SCB 배치하고 I2C 설정.

 

 

1. Creator 프로젝트의 스키메틱(아래 그림 파박) 선택하고, 오른쪽 Component Catalog 에서 I2C 선택하여 드래그드롭.

 

 

2. 배치된 SCB 더블클릭하여 설정작업.

 Name 에 이름 설정(모듈을 식별하는 고유이름.아래 그림 파박)

Configuration  탭에서  I2C 선택.

 

I2C Basic 탭에서 Mode 를 Master 로 선택. - 설정가능한 옵션 : Master, Slave, Multi-Master, Multi-Master-Slave 가능.

Data rate 100 kbps 선택- 설정가능한 옵션 : 50,100, 400, 1000 kbps가능.

 

나머지 설정은 기본값으로 둬도 됨. 상세하게 설정법을 알고 싶으면 대화상자 하단의 버튼 "DataSheet" 클릭하여 pdf문서에서 확인. 혹은 제조사 웹에서 제공하는 SCB 모듈의 데이터 시트 볼 수도 있다. -> http://www.cypress.com/?rID=78826

 

 

 

 

 

 

 

 

2. 펌웨어에서 SCB 기능 사용하기 위한 코드 추가.

 

앞의 1에서와 같이 I2C 를 사용하기 설정은 매우 간단하다. 이제 펌웨어 코드에서 이를 사용하기 위한 코드 추가한다.

아래 코드는 main.c 에서 I2C 모듈을 사용하기 위한 코드 예이다. Start 시키고 slave 측으로 데이터 전송하고 slave 측에서 데이터 읽기 함수를 호출하고 있는 예이다.

 

int main()
{
    I2C1_Start();
    
    CyGlobalIntEnable;

    /// Write to I2C Slave
    I2C1_I2CMasterWriteBuf(I2C_SLAVE_ADDR, buffer, PACKET_SIZE,
                          I2C1_I2C_MODE_COMPLETE_XFER);
    /// waits until master complete write transfer
    while(0u == (I2C1_I2CMasterStatus() & I2C1_I2C_MSTAT_WR_CMPLT));

   
    /// Read Data from the slave
    I2C1_I2CMasterReadBuf(I2C_SLAVE_ADDR, buffer, PACKET_SIZE,
                             I2C1_I2C_MODE_COMPLETE_XFER);
    /// waits until master complete read transfer
    while (0u == (I2C1_I2CMasterStatus() & I2C1_I2C_MSTAT_RD_CMPLT));
   
    while(1)
    {
   
       
    }
}
 

 

위에서 사용된 함수는 일부일 뿐이며, 사용가능한 API 함수들은 http://www.cypress.com/?rID=78826 의 pdf  파일 열어서 "I2C API" 부분에 설명된 함수들을 모두 사용가능하다.

 

 

 

 

 

 

I2C  송수신 함수

 

 

SCB는 I2C API 함수들이 여럿 제공되고 있다. (http://www.cypress.com/?rID=78826  의 I2C API 부분)

 

통신에서 필수 명확히 숙지해야할 것은 데이터 송수신이다. 

 

여러 바이트 데이터 송수신 함수.

 

송신.

uint32 SCB_I2CMasterWriteBuf(uint32 slaveAddress, uint8 * wrData, uint32 cnt, uint32 mode)

- 인자 slaveAddress : Right-justified 7-bit Slave address (valid range 8 to 120).

주의사항 : 슬레이브 어드레스 를 기록하는 것인데 만일 십진수 8(바이너리 1000) 을 기록했다면 I2C 전송시 바이트 표현은 0001000W,마지막 W는 Write bit 0이 기록되게된다.

- 인자로 전달된 버퍼 wrData , 수량  cnt 만큼을 슬레이브(주소 slaveAddress)로 전송한다.

- 인자 mode 는 아래 3 종이 있고, OR 로 지정가능.

 

 mode

설명

 SCB_I2C_MODE_COMPLETE_XFER

 Perform complete transfer from Start to Stop.

 SCB_I2C_MODE_REPEAT_START

 Send Repeat Start instead of Start.

 A Stop is generated after transfer is completed unless NO_STOP is specified.)

 SCB_I2C_MODE_NO_STOP

 Execute transfer without a Stop.

 The following transfer expected to perform ReStart.

 

함수반환값

 반환값

설명 

 SCB_I2C_MSTR_NO_ERROR

 Function complete without error. The master started the transfer.

 SCB_I2C_MSTR_BUS_BUSY

 Bus is busy. Nothing was sent on the bus. The attempt has to be retried.

  SCB_I2C_MSTR_NOT_READY

 Master is not ready for to start transfer.
A master still has not completed previous transaction or a slave operation is in progress (in multi-master-slave configuration).
Nothing was sent on the bus. The attempt has to be retried.

 

수신.

uint32 SCB_I2CMasterReadBuf(uint32 slaveAddress, uint8 * rdData, uint32 cnt, uint32 mode)

- 슬레이브(주소 slaveAddress )로 부터 수신된 데이터를 본 함수 인자로 전달된 수량 cnt 만큼 rdData 로 받는다.

 

 

1 바이트 단위 데이터 송수신 함수.

 

송신.

 uint32 SCB_I2CMasterWriteByte(uint32 theByte)

- 슬레이브로 인자로 전달된 1바이트 전송.

- blocking 함수 : 데이터 전송 완료/혹은 에러 발생시까지 함수는 리턴되지 않음.

 

수신.

uint32 SCB_I2CMasterReadByte(uint32 ackNack)

슬레이브로 부터 1바이트 읽기.

- blocking 함수 : 읽기 완료/혹은 에러 발생시까지 함수는 리턴되지 않음.

 

 

 

 

 

참고

I2C SCL, SDA핀의 출력예..

아래 사진의 D0(위)이 SCL. D1(아래)이 SDA.

 

 

회로상에서는 I2C 슬레이브 없는 상태에서 I2C Master 측에 아래와 같은 코드가 작동중일때이다.

 

 

 #define I2C_SLAVE_ADDR_EFM8  0x00
#define PACKET_SIZE 3

/* Packet positions */
#define PACKET_SOP_POS  (0u)
#define PACKET_CMD_POS  (1u)
#define PACKET_STS_POS  (PACKET_CMD_POS)
#define PACKET_EOP_POS  (2u)

/* Start and end of packet markers */
#define PACKET_SOP      (0x01u)
#define PACKET_EOP      (0x17u)

uint8_t buffer[PACKET_SIZE];


int main()
{
    I2C1_Start();
   
    CyGlobalIntEnable;

    /// Initialize buffer with packet
    buffer[PACKET_SOP_POS] = PACKET_SOP;
    buffer[PACKET_CMD_POS] = 0xFF; // data
    buffer[PACKET_EOP_POS] = PACKET_EOP;
   
  
    while(1)
    {
        /// Write to I2C Slave
        I2C1_I2CMasterWriteBuf(I2C_SLAVE_ADDR_EFM8, buffer, PACKET_SIZE,
                              I2C1_I2C_MODE_COMPLETE_XFER);
        /// waits until master complete write transfer
        while(0u == (I2C1_I2CMasterStatus() & I2C1_I2C_MSTAT_WR_CMPLT));
       
       
    }
}

 

 

 본 글이 포함된 상위 정리장소 

 

1. MCU  http://igotit.tistory.com/244

2. Connectivity : http://igotit.tistory.com/280 

 

 

///327.

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT