ADC124S051驱动代码编写-HAL库-USB虚拟串口发送
1、HAL库方式写的代码;USB虚拟串口发送;
2、USB虚拟串口发送方式在串口助手上没法显示十进制数据,我就专门写了一个显示十进制的助手,我自己用,不嫌弃的话就联系我要。我的还可以是实时显示数据波形哦。
3、数据发送给串口部分的代码没贴,只贴了核心的单通道和4通道 数据读取代码;
//定义通道选择
#define CH1 0B00000000
#define CH2 0B00001000
#define CH3 0B00010000
#define CH4 0B00011000
//读单个通道 函数返回ADC读到的数据;
//操作时序是:SCLK上升沿写入ADC寄存器,下降沿读取adc数据。
//可这样调用这个函数: ADC_read_signal_channel(CH1);这样就是读取通道1的数据
uint32_t ADC_read_signal_channel(uint8_t channel)
{
uint8_t i = 0;
uint32_t ADC_DATA = 0;
HAL_GPIO_WritePin(GPIOB, SCLK, 0);
HAL_GPIO_WritePin(GPIOA, CS3, 0);
delay_us(1);
//------------------------------
for (int i = 0; i < 16; i++)
{
HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel & 0x80) >> 7); //写入ADC control register
channel = channel << 1;
HAL_GPIO_WritePin(GPIOB, SCLK, 1);
delay_us(1);
if((i >= 4) && (i <= 15)) //从SCLK的第5个sclk开始读数据
{
if (HAL_GPIO_ReadPin(GPIOB, DATAIN)) //如果读到的状态是1
ADC_DATA |= (1 << (15-i));
}
HAL_GPIO_WritePin(GPIOB, SCLK, 0);
delay_us(1);
}
//-----------------------------------
HAL_GPIO_WritePin(GPIOA, CS3, 1);
return ADC_DATA;
}
//这个函数是在64个SCLK读完4个通道的数据,函数返回数组的地址;
//这个ADC是在第5个SCLK开始读取ADC转换的数据,在16个SCLK之内完成一个通道的读取;
//每个通道的读取都要先向ADC寄存器写入要读取哪个通道;
//前8个SCLK写入ADC寄存器选择的通道,后8个SCLK向ADC寄存器写什么都行,不影响结果。
uint32_t *ADC_read_multiple_channel()
{
static uint32_t value_array[NUMBER_OF_CHANNEL] = { 0 };
uint8_t i = 0,j=0;
uint8_t channel1 = 0B00000000;
uint8_t channel2 = 0B00001000;
uint8_t channel3 = 0B00010000;
uint8_t channel4 = 0B00011000;
uint32_t data1 = 0;
uint32_t data2 = 0;
uint32_t data3 = 0;
uint32_t data4 = 0;
HAL_GPIO_WritePin(GPIOB, SCLK, 0);
HAL_GPIO_WritePin(GPIOA, CS3, 0);
delay_us(1);
for (j = 0; j < 4; j++)
{
switch (j)
{
case 0:
for (int i = 0; i < 16; i++)
{
HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel1 & 0x80) >> 7); //写入ADC control register
channel1 = channel1 << 1;
HAL_GPIO_WritePin(GPIOB, SCLK, 1);
delay_us(1);
if ((i >= 4) && (i <= 15)) //从SCLK的第5个sclk开始读数据
{
if (HAL_GPIO_ReadPin(GPIOB, DATAIN)) //如果读到的状态是1
data1 |= (1 << (15 - i));
}
HAL_GPIO_WritePin(GPIOB, SCLK, 0);
delay_us(1);
}
break;
case 1:
for (int i = 0; i < 16; i++)
{
HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel2 & 0x80) >> 7); //写入ADC control register
channel2 = channel2 << 1;
HAL_GPIO_WritePin(GPIOB, SCLK, 1);
delay_us(1);
if ((i >= 4) && (i <= 15)) //从SCLK的第5个sclk开始读数据
{
if (HAL_GPIO_ReadPin(GPIOB, DATAIN)) //如果读到的状态是1
data2 |= (1 << (15 - i));
}
HAL_GPIO_WritePin(GPIOB, SCLK, 0);
delay_us(1);
}
break;
case 2:
for (int i = 0; i < 16; i++)
{
HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel3 & 0x80) >> 7); //写入ADC control register
channel3 = channel3 << 1;
HAL_GPIO_WritePin(GPIOB, SCLK, 1);
delay_us(1);
if ((i >= 4) && (i <= 15)) //从SCLK的第5个sclk开始读数据
{
if (HAL_GPIO_ReadPin(GPIOB, DATAIN)) //如果读到的状态是1
data3 |= (1 << (15 - i));
}
HAL_GPIO_WritePin(GPIOB, SCLK, 0);
delay_us(1);
}
break;
case 3:
for (int i = 0; i < 16; i++)
{
HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel4 & 0x80) >> 7); //写入ADC control register
channel4 = channel4 << 1;
HAL_GPIO_WritePin(GPIOB, SCLK, 1);
delay_us(1);
if ((i >= 4) && (i <= 15)) //从SCLK的第5个sclk开始读数据
{
if (HAL_GPIO_ReadPin(GPIOB, DATAIN)) //如果读到的状态是1
data4 |= (1 << (15 - i));
}
HAL_GPIO_WritePin(GPIOB, SCLK, 0);
delay_us(1);
}
break;
default:
break;
}
}
HAL_GPIO_WritePin(GPIOA, CS3, 1);
value_array[0] = data2;
value_array[1] = data3;
value_array[2] = data4;
value_array[3] = data1;
return value_array;
}
//在64个SCLK完成4通道读取时,实际读出来的数据顺序错开一个通道的,
//第1个16sclk读出来的数据其实是通道4的不是通道1,
//第2个16sclk读出来的数据其实是通道1的不是通道2,
//第3个16sclk读出来的数据其实是通道2的不是通道3,
//第4个16sclk读出来的数据其实是通道3的不是通道4.