ESP32通过SPI读取多个SPI Slave--6个MAX31865 RTD芯片

ESP32控制6个SPI设备


有一个ESP32想要读取6个MAX31865的RTD电阻,采用一个74HC138的3-8译码器作为6个MAX31865的选通。这里选择了Arduino IDE作为编程软件,从Adafruit下载的读取MAX31865的库。要选通读取可以对3-8进行编码,但这样要改变库函数,不希望对库进行修改,将固定的CS端连接到外部中断端,用函数
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode). 比如说pin 5与中断连接,这里:

  • ISR是要调用的中断程序
  • mode是:
  • LOW 当端子变低时触发中断
  • CHANGE 当端子变化时触发中断
  • RISING 当端子变高时触发中断
  • FAILING 当端子变低时触发中断。

我们这里选择了CHANGE来触发中断

选通电路

在这里插入图片描述
从图中可以看出,用ECS1,ECS2,ECS3来控制选通哪个MAX31865。

软件编程

采用Arduino IDE 1.8.13

void setup()
{
    
    
    max_1.begin(MAX31865_3WIRE);  // set to 2WIRE or 4WIRE as necessary
    pinMode(INTERRUPT_PIN, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), sCounter, CHANGE); 

从这里看到sCounter是要调用的中断程序,当我们在调用spi读取RTD的数据时会改变中断的端子,使其变成低电平。

再来看一下sCounter的代码的实现,看看中断程序的内容:

void sCounter()
{
    
    
    if (digitalRead(INTERRUPT_PIN))
    {
    
    
      csSelect(7);
    }
    else
      csSelect(si);  
}

变量si是要选择的spi的通道。

再看一下csSelect(si)的选通程序:

void csSelect(int ix)
{
    
    

  switch(ix)
  {
    
    
    case 0: digitalWrite(ECS3, LOW); digitalWrite(ECS2, LOW); digitalWrite(ECS1, LOW); break;
    case 1: digitalWrite(ECS3, LOW); digitalWrite(ECS2, LOW); digitalWrite(ECS1, HIGH); break;
    case 2: digitalWrite(ECS3, LOW); digitalWrite(ECS2, HIGH); digitalWrite(ECS1, LOW); break;
    case 3: digitalWrite(ECS3, LOW); digitalWrite(ECS2, HIGH); digitalWrite(ECS1, HIGH); break;
    case 4: digitalWrite(ECS3, HIGH); digitalWrite(ECS2, LOW); digitalWrite(ECS1, LOW); break;
    case 5: digitalWrite(ECS3, HIGH); digitalWrite(ECS2, LOW); digitalWrite(ECS1, HIGH); break;
    case 6: digitalWrite(ECS3, HIGH); digitalWrite(ECS2, HIGH); digitalWrite(ECS1, LOW); break;
    case 7: digitalWrite(ECS3, HIGH); digitalWrite(ECS2, HIGH); digitalWrite(ECS1, HIGH); break;
    default : digitalWrite(ECS3, HIGH); digitalWrite(ECS2, HIGH); digitalWrite(ECS1, HIGH); break;     
  }
}

程序说明

当读取SPI时,选择的CS端会被读取SPI设备的程序控制其改变。通过中断监视SPI的选通信号,当SPI选通信号为高时,我们通过选通选择信道7为低电平。当SPI选通信号时低电平时,这时是要对SPI进行读写操作了。我们选择相应的si选择的输出端为低电平,作为选通信号,就可以读写不同的SPI设备了。

猜你喜欢

转载自blog.csdn.net/weixin_44481398/article/details/117107504
今日推荐