有一个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设备了。