PSoC」カテゴリーアーカイブ

抵抗分圧 2.048V ADC PSoC4

抵抗分圧 2.048V ADC PSoC4
★22.528V*10K/(10K+100K)=2.048V for 14V (GND 10K TestPoint 100K 22V)
★06.405V*47K/(47K+100K)=2.048V for 5.5V (GND 47K TestPoint 100K 6V)
03.010V*100K/(100K+47K)=2.048V
★04.964V*33K/(33K+47K)=2.048V for 3.63V
03.485V*47K/(47K+33K)=2.048V

実験 AD値(誤差あり) – 電圧
0xC20 – 4.98V
0xC30 – 5.01V
0xC80 – 5.13V
0xC9D – 5.18V

実験 PSoC4 EZI2C I2C slave << Raspberry Pi Zero WH I2C master

実験 PSoC4 EZI2C I2C slave << Raspberry Pi Zero WH I2C master
I2C 通信線 Pull up していない、Pi側GPIO内部でPull upしているかも、要調査

Python code
read_byte_data, write_byte_data, read_i2c_block_data, write_i2c_block_data
どの命令も問題なく使用できた

Pi I2C Data rate 100Kbps >> EZI2C 1000Kbps (w/Clock stretching) >> エラーなし
Pi I2C Data rate 100Kbps >> EZI2C 400Kbps (w/Clock stretching) >> エラーなし
Pi I2C Data rate 100Kbps >> EZI2C 50Kbps (w/Clock stretching) >> エラーなし

Pi I2C Data rate 400Kbps >> EZI2C 50Kbps (w/Clock stretching) >> エラー多発
Pi I2C Data rate 400Kbps >> EZI2C 50Kbps (wo/Clock stretching) >> エラー多発
Pi I2C Data rate 400Kbps >> EZI2C 100Kbps (w/Clock stretching) >> エラー多発
Pi I2C Data rate 400Kbps >> EZI2C 400Kbps (w/Clock stretching) >> エラーなし
Pi I2C Data rate 400Kbps >> EZI2C 1000Kbps (w/Clock stretching) >> エラーなし

1812191334 (PSoC4) SCB_I2C SCB_EZI2C with Pi 動作OK.7z
064_I2C_EZI2C_PSoC4.py
PSoC4 EZI2C SCL P30, PSoC4 EZI2C SCA P31, Pi I2C1 SCL GPIO3 Pin#5, Pi I2C1 SDA GPIO2 Pin#3

一般的な共有RAMの問題、2バイト以上のデータ送受信に問題

送信側
読み込み中フラグ=OFF を確認
書き込み中フラグ=ON、ブロックデータを書き込む、書き込みが終了したら
書き込み中フラグ=OFF
受信側
書き込み中フラグ=OFF を確認
読み込み中フラグ=ON、ブロックデータを読み込み、終了したら
読み込み中フラグ=OFF
同時があり得る >> NG

PiがEZI2C使用中(データ読み書き中)でなければ、EZI2Cを一旦停止してから共有RAMへ書き込み、I2Cを再開する、Piは再実行処理必須
Piがデータ書き込む場合は、書き込み中フラグ=ON、待ち時間(PSoC共有RAM読み込みに要する時間、1ms程度?)、ブロックデータを書き込む、書き込みが終了したら、書き込み中フラグ=OFF
実験結果: 素ではエラー発生を防止できず >> I2C+コマンド処理系

実験 共有(I2C AQM0802) PSoC4 Raspberry Pi Zero WH

実験 共有(I2C AQM0802 LCD) PSoC4 Raspberry Pi Zero WH
I2C Slave AQM0802(address 0x3E)共有
I2C Master Raspberry Pi
I2C Multi-Master-Slave PSoC4(address 0x08)
$ i2cdetect -y 1 #AQM0802 と PSoC4 を認識している

Code Python Raspberry Pi

import smbus,time

i2c1=smbus.SMBus(1) #0=(port I2C0), 1=(port I2C1)
i2c1.write_i2c_block_data(0x3E,0x00,[0x38,0x39,0x14,0x78,0x5E,0x6A]); time.sleep(0.200) #200ms
i2c1.write_i2c_block_data(0x3E,0x00,[0x0C,0x01]); time.sleep(0.002) #2ms
i2c1.write_byte_data(0x3E,0x00,0x06)
i2c1.write_byte_data(0x3E,0x00,0xC0) #0x80=1st line #0xC0=2nd
i2c1.write_i2c_block_data(0x3E,0x40,[ord(' '),ord(' '),ord('P'),ord('i'),ord(' '),ord('I'),ord('2'),ord('C')])

d=1
while 1:
    d=0x30+((1+d)%10) #9-0 countdown ascii
    time.sleep(1.000) #1s
    try:
        i2c1.write_byte_data(0x3E,0x00,0xC0) #0xC0=2nd line
        i2c1.write_byte_data(0x3E,0x40,d)
    except Exception as e:
        pass ;print(e) #error if exist

Code C PSoC4

...
    const uint8 b0[]={0x00,  0x80}; //1st 0x00 not valid //0x80=1st line 0xC0=2nd line
    const uint8 b1[]={0x00,  ' ',' ','P','S','o','C','4'}; //1st 0x00 not valid
    uint8   d[2];
	while(1) {
		CyDelay(1000);        
                I2C_write((uint8 *)b0, 0x3E, 0x00, 1);
                I2C_write((uint8 *)b1, 0x3E, 0x40, 7);
                d[1]=0x30+((1+d[1])%10); //9-0 countdown ascii
                I2C_write((uint8 *)b0, 0x3E, 0x00, 1);
                I2C_write((uint8 *)d,  0x3E, 0x40, 1);
...


I2C Master PSoC4 の設定でも共有可(通信のコンフリクトがあるだろう)