STM32:GPIO模拟SPI驱动ADS8361

ADS8361是TI公司开发的一款模拟量输入芯片。ADS8361有四种工作模式,本文主要针对模式三进行通信驱动。官方方案使用两路SPI来通信,一路SPI Master,一路SPI Slave。我在使用STM32主控芯片的两路SPI进行通信的时候,发现只有SPI Master这路可以正常工作。Slave一直无法接收到数据。估计是两路SPI同时通信会有问题。所以使用了GPIO模拟SPI来驱动ADS8361。

硬件系统接线示意图:

模式三通信时序图:

下面是驱动程序:

objectivec 复制代码
/*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);
}

三路模拟量输入通道的测试结果:

相关推荐
追梦少年时6 小时前
STM32-Flash闪存
stm32·单片机·嵌入式硬件·51单片机
weixin_452600697 小时前
《青牛科技 GC6125:驱动芯片中的璀璨之星,点亮 IPcamera 和云台控制(替代 BU24025/ROHM)》
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·智能充电枪
weixin_452600699 小时前
【青牛科技】14W 高保真音频放大电路——D2030
科技·单片机·嵌入式硬件·音视频·电动工具·智能电表
小刘同学-很乖16 小时前
MQTT从入门到精通之MQTT Dashboard
spring boot·stm32·物联网·iot
YuCaiH16 小时前
【STM32】USART串口数据包
笔记·stm32·单片机·嵌入式硬件
Kasen's experience18 小时前
STM32 GPIO 配置
stm32·单片机·嵌入式硬件
知行电子-18 小时前
Proteus中数码管动态扫描显示不全(已解决)
单片机·proteus·嵌入式
学习路上_write19 小时前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
非概念19 小时前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
jjjxxxhhh12321 小时前
FPGA,使用场景,相比于单片机的优势
单片机·嵌入式硬件·fpga开发