【GD32F450 试用】 A3.驱动ADS8332采集电位器电压
GD32
5419 人阅读
|
0 人回复
|
2017-06-14
TA的每日心情 | 开心 2024-10-14 08:33 |
|---|
签到天数: 2451 天 连续签到: 1 天 [LV.Master]伴坛终老
司徒
- 积分
- 33848
 
|
本帖最后由 limale 于 2017-6-14 21:42 编辑
上一篇我们总算是用硬件SPI把OLED驱动起来了,虽然过程有点曲折可能对GD32了解的还是不够多。
这一篇我们还是使用硬件SPI来驱动一款TI的高速ADC芯片型号是ADS8332,这款芯片的特点有低功耗、16位分辨率、高达500-kSPS的采样速率、高达8通道的输入。
ADS8332数据手册:
除了SPI连接外我们还需要四个IO,三个输出控制和一个输入。
这里我们为了连线的方便选取PD3、PD4、PD6作为输出PD5作为输入,端口初始化如下。
- /* ADS8332 GPIO config */
- gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_5);
- gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6);
- gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6);
- gpio_bit_set(GPIOB,GPIO_PIN_3);
- gpio_bit_set(GPIOB,GPIO_PIN_4);
- gpio_bit_set(GPIOB,GPIO_PIN_6);
复制代码 为了有时候调试的方便,我们这里也把串口初始化并重定向到printf()
查看开发板原理图得知实际连接的是USART2,TX和RX分别是PD8和PD9。
所以我们进行如下的定义:
使用一下代码进行重定向到标准的输出设备。
这里需要注意的是,keil中这里的设置要勾选上该项。
在实际使用SPI方式发送16位的读取指令后,发现需要调用两次spi_i2s_data_receive(SPI0)才能接收到正确的数据,现在还没搞明白是什么原因。- //读取CFR寄存器的值
- uint16_t ADS8332_SPI_ReadCFR(uint16_t Data)
- {
- uint8_t txdata[1] = { 0 };
- uint8_t rxdata[2] = { 0 };
- uint16_t temp;
-
- txdata[0] = Data >>8;
- ADS8332_CS_RESET;
- spi_i2s_data_transmit(SPI0, txdata[0]);
- while(spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == RESET);
- ADS8332_Delay(0x0f);
- rxdata[0] = spi_i2s_data_receive(SPI0);
- rxdata[0] = spi_i2s_data_receive(SPI0);
-
-
- spi_i2s_data_transmit(SPI0, 0x00);
- while(spi_i2s_flag_get(SPI0, SPI_STAT_RBNE) == RESET);
- ADS8332_Delay(0x0f);
- rxdata[1] = spi_i2s_data_receive(SPI0);
- rxdata[1] = spi_i2s_data_receive(SPI0);
- ADS8332_CS_SET;
-
- temp = (rxdata[0] << 8) | rxdata[1];
- return temp;
- }
复制代码 下边是在通道0上接了一个电位器转换得到的电压值,因为别的通道是悬空的所以数值是变化的。
同时在OLED上也可以看到转换的电压值。
虽然还有些问题搞得不是很清楚,但是总算是可以读取到转换结果了。下来准备再完善一下,就可以提交最终的项目方案了。等有空了再好好研究一下这么细节问题吧。
工程:
|
|
|
|
|
|
|
|
|