ADS8361是TI公司开发的一款模拟量输入芯片。ADS8361有四种工作模式,本文主要针对模式三进行通信驱动。官方方案使用两路SPI来通信,一路SPI Master,一路SPI Slave。我在使用STM32主控芯片的两路SPI进行通信的时候,发现只有SPI Master这路可以正常工作。Slave一直无法接收到数据。估计是两路SPI同时通信会有问题。所以使用了GPIO模拟SPI来驱动ADS8361。
硬件系统接线示意图:
模式三通信时序图:
下面是驱动程序:
- /*Global variables*/
- float Ain1, Ain2 , Ain3;
-
- static float Calculate_Volt_By_SPI_Data(uint8_t* data)
- {
- uint32_t temp1, temp2, temp3, temp4;
-
- temp1 = data[0] & 0X1F;
- temp2 = data[1];
- temp3 = data[2] >> 5;
- temp4 = temp1 * 2048 + temp2 * 8 + temp3;
-
- if(temp4 >= 0x8000)
- {
- temp4 -= 0x8000;
- }
- else
- {
- temp4 += 0x8000;
- }
-
- return 10.0 - (float)temp4/65535*20;
- }
-
- static void Monitor_AIN_Level(void)
- {
- uint8_t SPI1_RD[3] = {0x00, 0x00, 0x00};
- uint8_t SPI2_RD[3] = {0x00, 0x00, 0x00};
- uint8_t Invalid_ARR[3] = {0x00, 0x00, 0x00};
-
- for(int i = 0; i < 20; i++)
- {
- HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_SET);
-
- if(i == 0)
- {
- HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port, SPI1_MOSI_Pin, GPIO_PIN_SET);
- }
- else if(i == 1)
- {
- HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port, SPI1_MOSI_Pin, GPIO_PIN_RESET);
- }
-
- delay_us(1);
-
- HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_RESET);
-
- if(HAL_GPIO_ReadPin(SPI1_MISO_GPIO_Port, SPI1_MISO_Pin) == GPIO_PIN_SET)
- {
- SPI1_RD[i/8] += (1 << (7 - (i % 8)));
- }
-
- if(HAL_GPIO_ReadPin(SPI2_MOSI_GPIO_Port, SPI2_MOSI_Pin) == GPIO_PIN_SET)
- {
- SPI2_RD[i/8] += (1 << (7 - (i % 8)));
- }
-
- delay_us(1);
- }
-
- HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_RESET);
-
- if(memcmp(SPI1_RD, Invalid_ARR, sizeof(SPI1_RD)) == 0 || memcmp(SPI2_RD, Invalid_ARR, sizeof(SPI2_RD)) == 0)
- {
- return;
- }
-
- if(SPI1_RD[0] >= 0x60 || SPI2_RD[0] >= 0x60)
- {
- return;
- }
-
- if((SPI1_RD[0] & 0x40) > 0) Ain2 = Calculate_Volt_By_SPI_Data(SPI1_RD);
- else Ain1 = Calculate_Volt_By_SPI_Data(SPI1_RD);
-
- if((SPI2_RD[0] & 0x40) == 0) Ain3 = Calculate_Volt_By_SPI_Data(SPI2_RD);
-
- //Usart_Printf("Ain1: %f\n", Ain1);
- //Usart_Printf("Ain2: %f\n", Ain2);
- //Usart_Printf("Ain3: %f\n", Ain3);
- }
三路模拟量输入通道的测试结果: