Faced with the fact that SPI stops working, I can’t understand why, since there is no exception. I'm using a non-standard way for the transfer event. This is due to the fact that the Raspberry Pi cannot be a slave. My master is STM32F103C8T6. To solve this problem, GPIO was raised on the Raspberry Pi.
private void InitGPIO()
{
gpioController = GpioController.GetDefault();
gpioPinSTM = gpioController.OpenPin(GPIO_PIN25);
gpioPinSTM.IsDriveModeSupported(GpioPinDriveMode.InputPullDown);
gpioPinSTM.SetDriveMode(GpioPinDriveMode.Input);
gpioPinSTM.ValueChanged += Gpio_ValueChanged;
}
STM changes the state of the GPIO, and the Gpio_ValueChanged method is triggered by any change.
private void Gpio_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
if (args.Edge == GpioPinEdge.RisingEdge)
{
STM32F103C6T6.TransferFullDuplex(arrToSTM, arrFromSTM);
getFromSTM();
}
}
Wrote separately diagnostics at transaction. Where do I get data from STM. The first element of the array comes with iteration. As you can see then I start to get 0.
I decided that spi should run on a separate thread. By executing a transaction in a timer.
void TimerSPI(object sender, object e)
{
if (gpioPinSTM.Read() == GpioPinValue.High)
{
if (checkGPIOStatus == 1)
{
STM32F103C6T6.TransferFullDuplex(arrToSTM, arrFromSTM);
getFromSTM();
checkGPIOStatus = 0;
}
}
else if (gpioPinSTM.Read() == GpioPinValue.Low)
{
checkGPIOStatus = 1;
}
}
Used two types of timers and got different results First option:
private DispatcherTimer timer = new DispatcherTimer();
....
timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(3) };
timer.Tick += TimerSPI;
timer.Start();
Second option:
private static System.Timers.Timer timer;
....
timer = new System.Timers.Timer(3);
timer.Elapsed += TimerSPI;
timer.AutoReset = true;
timer.Enabled = true;
In the first case, it works fine, but slowly. In the second case, it works quickly, but the same situation occurs as described above. Maybe someone knows how such a transaction can be implemented? And maybe my approach is completely wrong, I don't know...

I found this solution, I don’t know how true it is, but it helped me.
STM operates in standby mode at 0 and 1.