STM32 HAL 硬件SPI XPT2046

初次尝试请不要使用过高的速率

 STM32 HAL 硬件SPI XPT2046_第1张图片

 严格按照发送8bit命令,再接收16bit或2次8bit数据来进行,不要有多余的操作,否则数据紊乱。

每次转换必须在开始后(接收到 start)的 1.6mS 内 完成,否则输入采样保持电路取样的信号会逐渐被放电衰减,影响转换结果。

#include 
//两个接口函数
void send_8way(uint8_t data)
{
    HAL_SPI_Transmit(spi_, &data, 1, 1000); //不配置硬件片选(NSS)功能,手动片选
}

uint8_t receiv_8way(void)
{
    uint8_t data;
    HAL_SPI_Receive(spi_, &data, 1, 1000);
    return data;
}

int cmp(const void *a, const void *b)
{
    return *(uint16_t *)a - *(uint16_t *)b; //从小到大排序(b-a则是从大到小)。需要与被测类型一致,否则排序乱七八糟
}

static const uint8_t count = 9; //采集次数
uint16_t x_data[count], y_data[count];
void XPT2046_Rd_Addata(void)
{
    cs2_0(); //片选

    for (uint8_t i = 0; i < count; i++)
    {
        send_8way(0xd0); //发送命令
        x = receiv_8way();
        x <<= 8;
        x |= receiv_8way();
        x >>= 4;
        x_data[i] = x;

        send_8way(0x90);

        y = receiv_8way();
        y <<= 8;
        y |= receiv_8way();
        y >>= 4;
        y_data[i] = y;
    }
    qsort(x_data, count, sizeof(x_data[0]), cmp); //stdlib.h里的排序函数
    qsort(y_data, count, sizeof(y_data[0]), cmp);
    x = x_data[count >> 1]; //取中间值
    y = y_data[count >> 1];
    cs2_1();
}

STM32 HAL 硬件SPI XPT2046_第2张图片

你可能感兴趣的:(MCU)