Raspberry Pi PicoからRaspberry Pi 4Bに一定時間ごとに割り込みをかけ、spi通信をおこない、Raspberry Pi 4BのSCLKの立ち上がりで、Raspberry Pi Picoに割り込みをかけて、Raspberry Pi PicoからMSBから順に16ビット送って、SCLKの立下りで、Raspberry Pi Picoからの信号をRaspberry Pi 4Bで読み取りたいと思うのですが、Raspberry Pi PicoからRaspberry Pi 4Bへの割り込みが一回しかかからないのですが、どうすれば良いでしょうか?
Raspberry Pi Picoに書き込んだC言語とpioアセンブリのプログラムは以下のものです。
C言語
1#include <stdio.h> 2#include <string.h> 3#include <math.h> 4 5#include "hardware/gpio.h" 6#include "pico/stdlib.h" 7#include "hardware/pio.h" 8#include "hardware/clocks.h" 9 10#include "myapp.pio.h" 11 12 13#define INTERRUPT_RASPBERRY4B 28 14 15#define MISO 26 16 17 18#define RASPBERRY4B_SCLK 27 19 20void callback_MISO2(); 21void callback_MISO3(); 22void callback_MISO4(); 23void callback_MISO5(); 24void callback_MISO6(); 25void callback_MISO7(); 26void callback_MISO8(); 27void callback_MISO9(); 28void callback_MISO10(); 29void callback_MISO11(); 30void callback_MISO12(); 31void callback_MISO13(); 32void callback_MISO14(); 33void callback_MISO15(); 34void callback_MISO16(); 35 36static inline void INTERRUPT_RASPBERRY4B_select(){ 37 asm volatile("nop \n nop \n nop"); 38 gpio_put(INTERRUPT_RASPBERRY4B, 0); 39 asm volatile("nop \n nop \n nop"); 40} 41 42static inline void INTERRUPT_RASPBERRY4B_deselect(){ 43 asm volatile("nop \n nop \n nop"); 44 gpio_put(INTERRUPT_RASPBERRY4B, 1); 45 asm volatile("nop \n nop \n nop"); 46} 47 48uint bitdata1; 49uint bitdata2; 50 51void callback_MISO1(){ 52 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO1); 53 pio_sm_clear_fifos(pio1, 0); 54 55 bitdata2 = bitdata1 & 0b1000000000000000>>15; 56 57 pio_sm_put_blocking(pio1, 0, bitdata2); 58 sleep_us(10); 59 60 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO2); 61} 62 63void callback_MISO2(){ 64 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO2); 65 pio_sm_clear_fifos(pio1, 0); 66 67 bitdata2 = (bitdata1 & 0b0100000000000000)>>14; 68 69 pio_sm_put_blocking(pio1, 0, bitdata2); 70 sleep_us(10); 71 72 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO3); 73} 74 75void callback_MISO3(){ 76 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO3); 77 pio_sm_clear_fifos(pio1, 0); 78 79 bitdata2 = (bitdata1 & 0b0010000000000000)>>13; 80 81 pio_sm_put_blocking(pio1, 0, bitdata2); 82 sleep_us(10); 83 84 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO4); 85} 86 87void callback_MISO4(){ 88 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO4); 89 pio_sm_clear_fifos(pio1, 0); 90 91 bitdata2 = (bitdata1 & 0b0001000000000000)>>12; 92 93 pio_sm_put_blocking(pio1, 0, bitdata2); 94 sleep_us(10); 95 96 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO5); 97} 98 99void callback_MISO5(){ 100 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO5); 101 pio_sm_clear_fifos(pio1, 0); 102 103 bitdata2 = (bitdata1 & 0b0000100000000000)>>11; 104 105 pio_sm_put_blocking(pio1, 0, bitdata2); 106 sleep_us(10); 107 108 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO6); 109} 110 111void callback_MISO6(){ 112 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO6); 113 pio_sm_clear_fifos(pio1, 0); 114 115 bitdata2 = (bitdata1 & 0b0000010000000000)>>10; 116 117 pio_sm_put_blocking(pio1, 0, bitdata2); 118 sleep_us(10); 119 120 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO7); 121} 122 123void callback_MISO7(){ 124 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO7); 125 pio_sm_clear_fifos(pio1, 0); 126 127 bitdata2 = (bitdata1 & 0b0000001000000000)>>9; 128 129 sleep_us(10); 130 pio_sm_put_blocking(pio1, 0, bitdata2); 131 sleep_us(10); 132 133 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO8); 134} 135 136void callback_MISO8(){ 137 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO8); 138 pio_sm_clear_fifos(pio1, 0); 139 140 bitdata2 = (bitdata1 & 0b0000000100000000)>>8; 141 142 pio_sm_put_blocking(pio1, 0, bitdata2); 143 sleep_us(10); 144 145 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO9); 146} 147 148void callback_MISO9(){ 149 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO9); 150 pio_sm_clear_fifos(pio1, 0); 151 152 bitdata2 = (bitdata1 & 0b0000000010000000)>>7; 153 154 pio_sm_put_blocking(pio1, 0, bitdata2); 155 sleep_us(10); 156 157 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO10); 158} 159 160void callback_MISO10(){ 161 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO10); 162 pio_sm_clear_fifos(pio1, 0); 163 164 bitdata2 = (bitdata1 & 0b0000000001000000)>>6; 165 166 pio_sm_put_blocking(pio1, 0, bitdata2); 167 sleep_us(10); 168 169 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO11); 170} 171 172void callback_MISO11(){ 173 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO11); 174 pio_sm_clear_fifos(pio1, 0); 175 176 bitdata2 = (bitdata1 & 0b0000000000100000)>>5; 177 178 pio_sm_put_blocking(pio1, 0, bitdata2); 179 sleep_us(10); 180 181 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO12); 182} 183 184void callback_MISO12(){ 185 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO12); 186 pio_sm_clear_fifos(pio1, 0); 187 188 bitdata2 = (bitdata1 & 0b0000000000010000)>>4; 189 190 pio_sm_put_blocking(pio1, 0, bitdata2); 191 sleep_us(10); 192 193 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO13); 194} 195 196void callback_MISO13(){ 197 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO13); 198 pio_sm_clear_fifos(pio1, 0); 199 200 bitdata2 = (bitdata1 & 0b0000000000001000)>>3; 201 202 pio_sm_put_blocking(pio1, 0, bitdata2); 203 sleep_us(10); 204 205 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO14); 206} 207 208void callback_MISO14(){ 209 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO14); 210 pio_sm_clear_fifos(pio1, 0); 211 212 bitdata2 = (bitdata1 & 0b0000000000000100)>>2; 213 214 pio_sm_put_blocking(pio1, 0, bitdata2); 215 sleep_us(10); 216 217 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO15); 218} 219 220void callback_MISO15(){ 221 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO15); 222 pio_sm_clear_fifos(pio1, 0); 223 224 bitdata2 = (bitdata1 & 0b0100000000000010)>>1; 225 226 pio_sm_put_blocking(pio1, 0, bitdata2); 227 sleep_us(10); 228 229 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO16); 230} 231 232 233void callback_MISO16(){ 234 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO16); 235 pio_sm_clear_fifos(pio1, 0); 236 237 bitdata2 = bitdata1 & 0b0000000000000001; 238 239 pio_sm_put_blocking(pio1, 0, bitdata2); 240 sleep_us(10); 241 242 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO1); 243} 244 245 246 247 248 249 250 251int main() 252{ 253 stdio_init_all(); 254 255 sleep_ms(3000); 256 257 gpio_init(INTERRUPT_RASPBERRY4B); 258 gpio_set_dir(INTERRUPT_RASPBERRY4B, GPIO_OUT); 259 260 gpio_init(RASPBERRY4B_SCLK); 261 gpio_set_dir(RASPBERRY4B_SCLK, GPIO_IN); 262 gpio_pull_down(RASPBERRY4B_SCLK); 263 264 265 266 uint addr = pio_add_program(pio1, &pioasm_program); 267 268 sleep_ms(5000); 269 270 pioasm_exec( 271 pio1, 272 0, 273 addr, 274 275 276 MISO, 277 1, 278 279 280 0, 281 0, 282 283 284 0, 285 0, 286 287 288 125.0 289 ); 290 291 292 293 bitdata1 = 43690; 294 295 296 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO1); 297 298 299 while(true){ 300 INTERRUPT_RASPBERRY4B_deselect(); 301 sleep_us(5); 302 INTERRUPT_RASPBERRY4B_select(); 303 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO1); 304 sleep_ms(8000); 305 gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO1); 306 307 } 308 309 return 0; 310 311} 312 313 314 315 316 317
pioアセンブリ
1.program pioasm 2.wrap_target 3 pull block 4 5 6 out pins, 1 7.wrap 8 9 10 11 12 13% c-sdk { 14 15void pioasm_exec( 16 PIO pio, 17 uint state_machine, 18 uint prog_addr, 19 20 uint outpin_base, 21 uint num_outpin, 22 23 uint inpin_base, 24 uint num_inpin, 25 26 uint sidepin_base, 27 uint num_sidepin, 28 29 float clkdiv 30) 31{ 32 省略 33} 34 35 36%} 37 38Raspberry Pi 4Bに書き込んだPythonのプログラムは以下のものです。 39
Python
1#coding: utf-8 2 3import RPi.GPIO as GPIO 4import spidev 5import time 6import datetime 7 8dummyData = [0x00,0x00] 9 10spi = spidev.SpiDev() 11spi.open(0, 0) 12 13# Settings 14spi.max_speed_hz = 10000 # 10kHz 15spi.mode = 0 # SPI mode : 0 16 17def write_csv(bitData): 18 dt_now = datetime.datetime.now() 19 with open('ADS8329.csv', 'a') as f: 20 f.write(dt_now.strftime('%Y/%m/%d %H:%M:%S') + "," + str(bitData) + "\n") 21 22class CallBack: 23 24 def __init__(self): 25 # 4番pinを入力、プルアップに設定 26 self.pin = 4 27 GPIO.setmode(GPIO.BCM) 28 GPIO.setup(self.pin, GPIO.IN, GPIO.PUD_UP) 29 30 def callback_test(self): 31 32 while(True): 33 # 立下りエッジイベント、タイムアウトイベント待ち 34 isr = GPIO.wait_for_edge(self.pin, GPIO.FALLING, timeout=5, bouncetime=1) 35 if isr is None: 36 # 5m秒間割り込みがないときに実行される 37 print("5ms秒間割り込みなし") 38 else: 39 readByteArray = spi.xfer2(dummyData) 40 bitData = ((readByteArray[0] & 0b11111111) << 8) | (readByteArray[1]) 41 write_csv(bitData) 42cb = CallBack() 43cb.callback_test() 44 45