PYNQ > XSDK > I2C 통신 > MLX90632의 EEPROM Version 읽기

12806 단어 MLX90632XSDKI2CPYNQ
운영 환경
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
Analog Discovery 2 (以下、AD2)

개요


  • I2C (EMIO) 사용
  • XSDK에서 I2C 통신 구현
  • EEPROM 버전 읽기


  • 관련



  • borgThermo > 방사 온도계 > 제1회: STM32L476과 MLX96032의 통신(I2C)
  • MLX96032에 대한 정보는 여기를 참조하십시오


  • 참고



  • ZYBO의 PS로 I2C를 움직여 보았습니다.
  • Todotani의 물건 Log
  • 정보 감사입니다


  • 이 기사를 참고로 PYNQ-Z1에서 시도했습니다.

    블록 디자인



    I2C 0의 EMIO를 선택합니다.


    IIC_0이 추가되므로 Make External한다. 이름은 IIC_0이었다.

    이하의 Block Design이 된다.


    제약 파일



    ZYNQ-Z1용 프리셋 파일( PYNQ-Z1_C.xdc )에 기재되어 있는 I2C의 P16과 P15를 I/O 포트로 설정해 둔다(Run Synthesize 후).
    3.3V에서 사용하기 위해 LVCMOS33을 선택했다.
    set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_scl_io]
    set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_sda_io]
    set_property PACKAGE_PIN P16 [get_ports IIC_0_scl_io]
    set_property PACKAGE_PIN P15 [get_ports IIC_0_sda_io]
    

    MLX90632



    Zephyr RTOS 공부시에 구입한 다음을 사용한다.
    EEPROM version의 읽기 통신이 있어, 그것을 이용하여 I2C 동작을 확인하기로 했다.

    MLX90632 방사 온도계 센서 클릭 보드 [CLICK-IRThermo]
    h tp // w w. 미 c로테 ch에게 카쇼 p. jp / 쇼 p에서 싶은 l / 000000000108 / ぢ sp_pc /

    I2C 주소는 0x3A .
    풀업 저항은 기판상의 것을 그대로 사용했다 (1kΩ 풀업 저항).

    연결



    Arduino Connector의 오른쪽 상단에있는 SCL, SDA를 사용했습니다.
    htps : ///레후오렌세.ぢぎぇちん c. 코 m / 레후 렌세 / p 로그 라마 b ぇ - ぉ 기 c / pyn q-z 1 / 르후 렌세 마누아 l
    「17 Arduino/chipKIT Shield Connector」

    Docs » PYNQ Libraries » Arduino (I2C: SCL, SDA)도 기재되어 있다.
  • PYNQ-Z1 <--> MLX90632 [CLICK-IRThermo]
  • 3V3 <--> 3V3
  • GND <--> GND
  • SCL <--> SCL
  • SDA <--> SDA


  • XSDK



    이번에는 Python이 아니라 XSDK에서 실행한다.
    Python (PYNQ Library)에서 I2C 실행에 대해서는 알 수 없습니다.

    구현은 여기에 소개된 것 에 대해서, 기입을 복수 캐릭터 라인으로 실행할 수 있도록(듯이) i2c_buffwrite() 를 추가했다.

    helloWorld.c
    #include "platform.h"
    #include "xparameters.h"
    #include "sleep.h"
    #include "xiicps.h"
    #include "stdio.h"
    
    
    // I2C parameters
    #define IIC_SCLK_RATE       100000  // clock 100KHz
    #define MLX90632_ADDRESS    0x3A    // 7bit address
    #define IIC_DEVICE_ID       XPAR_XIICPS_0_DEVICE_ID
    
    XIicPs Iic;
    
    int Init()
    {
        int Status;
        XIicPs_Config *Config;  /**< configuration information for the device */
    
        Config = XIicPs_LookupConfig(IIC_DEVICE_ID);
        if(Config == NULL){
            printf("Error: XIicPs_LookupConfig()\n");
            return XST_FAILURE;
        }
    
        Status = XIicPs_CfgInitialize(&Iic, Config, Config->BaseAddress);
        if(Status != XST_SUCCESS){
            printf("Error: XIicPs_CfgInitialize()\n");
            return XST_FAILURE;
        }
    
        Status = XIicPs_SelfTest(&Iic);
        if(Status != XST_SUCCESS){
            printf("Error: XIicPs_SelfTest()\n");
            return XST_FAILURE;
        }
    
        XIicPs_SetSClk(&Iic, IIC_SCLK_RATE);
        printf("I2C configuration done.\n");
    
        return XST_SUCCESS;
    }
    
    int i2c_buffwrite(XIicPs *Iic, u8* buff, u32 len, u16 i2c_adder)
    {
        int Status;
    
        Status = XIicPs_MasterSendPolled(Iic, buff, len, i2c_adder);
    
        if(Status != XST_SUCCESS){
            return XST_FAILURE;
        }
    
        // Wait until bus is idle to start another transfer.
        while(XIicPs_BusIsBusy(Iic)){
            /* NOP */
        }
    
        return XST_SUCCESS;
    }
    
    
    int i2c_read(XIicPs *Iic, u8* buff, u32 len, u16 i2c_adder)
    {
        int Status;
    
        Status = XIicPs_MasterRecvPolled(Iic, buff, len, i2c_adder);
    
        if (Status == XST_SUCCESS)
            return XST_SUCCESS;
        else
            return -1;
    }
    
    
    int main()
    {
        init_platform();
        Init();
    
        u8    wrbuff[] = { 0x24, 0x0B }; // Raed EEPROM version
        u8    rdbuff[4];
        u16   rawdata;
        float temp;
    
        while(1) {
            i2c_buffwrite(&Iic, wrbuff, 2, MLX90632_ADDRESS);
            i2c_read(&Iic, rdbuff, 2, MLX90632_ADDRESS);
    
            usleep(1000*1000);      // sleep 1sec (1000 x 1000us)
        }
    
        cleanup_platform();
        return 0;
    }
    

    Analog Discovery 2(AD2)의 모니터



    상기의 구현을 디버그 실행하였다.

    아래와 같이 AD2로 통신을 확인할 수 있었다.



    조금 수염이 나오고 있지만, 0x04, 0x87이라는 EEPROM Version을 읽을 수있는 것 같다.
    실사용시에는 이 수염의 대처가 필요하게 되지만, 일단 PYNQ로부터 I2C 통신은 할 수 있게 되었다.



    PYNQ Library



    htps : // ぢs 쿳 s. pynq. 이오 / t / 호 w - 우세 - 2c - 우 th-pyn q-z 1/1039
    위의 구현을 시도했지만 PL.ip_dict가 비어 있었기 때문에 구현할 수 없었습니다.

    좋은 웹페이지 즐겨찾기