PYNQ > XSDK > I2C 통신 > MLX90632의 EEPROM Version 읽기
Windows 10 Pro (v1909)
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
Analog Discovery 2 (以下、AD2)
개요
관련
borgThermo > 방사 온도계 > 제1회: STM32L476과 MLX96032의 통신(I2C)
참고
ZYBO의 PS로 I2C를 움직여 보았습니다.
이 기사를 참고로 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)도 기재되어 있다.
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가 비어 있었기 때문에 구현할 수 없었습니다.
Reference
이 문제에 관하여(PYNQ > XSDK > I2C 통신 > MLX90632의 EEPROM Version 읽기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/51b2912f95d588da3b5a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)