Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
GD32F450 驱动 芯海科技 ADC芯片 cs1237
发布于 2022-01-16 10:59:16 浏览:2147
订阅该版
[tocm] ### **GD32驱动芯海科技CS1237** ### 一、说明 手中项目ADC芯片使用的是芯海科技的CS1237芯片,此芯片使用spi驱动,本以为通用spi就行了,结果ennn一看手册我的天,收发口是一个,spi是两线的我的天,一个CLK,另一个DRDY / DOUT发送数据接收数据一个口,然后看看咋控吧,我天啊,根据时钟个数第几个来说是读是写好麻烦啊,这样就不能使用通用spi借口了。 ![QQ图片20220116101651.png](https://oss-club.rt-thread.org/uploads/20220116/e80cb99e24ce07d5a557f67266a6da9e.png.webp) ### 二、基本初始化 我这个项目CS1237因为在与单片机中间有隔离,又发现我去隔离器只能收数据,不能发数据,没办法了跳线吧,跟我们领导一说,领导拍板,接两根线,反正也是模拟的spi口,就这样芯片一个引脚接了两根线。好吧开始写。 首先初始化引脚,两个配置成输出模式,一个配置成输入模式,接的是PE2/PE4/PE5先初始化吧 ``` rcu_periph_clock_enable(RCU_GPIOE);//使能时钟 //cs1237 gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_2| GPIO_PIN_5);//PE2 时钟clk PE5 发送 gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2| GPIO_PIN_5); gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4);//读取 ``` ### 三、正式编写读取配置芯片 下面正式开始配置读取接收函数, 查看手册时钟不能超过100us所以包装成函数吧,时钟拉高一个拉低一个。 ![QQ图片20220116102438.png](https://oss-club.rt-thread.org/uploads/20220116/b8590725aeb1ec8d97e89a9311e6ad20.png.webp) ``` void cs1237_clk_high(void) { gpio_bit_set(GPIOE, GPIO_PIN_2); } void cs1237_clk_low(void) { gpio_bit_reset(GPIOE, GPIO_PIN_2); } ``` 先看看数据接收发送的功能吧,好多字啊,脑袋大了 ![QQ图片20220116102904.png](https://oss-club.rt-thread.org/uploads/20220116/bcaf65990eb1c3f1713884c80d747963.png.webp) ![QQ图片20220116104047.png](https://oss-club.rt-thread.org/uploads/20220116/6d8811b6533e602813297b9ee31df32c.png.webp) 总的来说,想要只读取的话24个数据,还有三个输出寄存器状态更新标志的时钟,如果不需要配置,就只读取发送27个时钟就可以了。写一个吧 ``` int32_t CS1237_read_data() { uint8_t i; int32_t read_data; if(! gpio_input_bit_get(GPIOE,GPIO_PIN_4))//判断数据是不是准备好了 { //1-24个SCLK,读取ADC的转换结果 for(i=1; i<=24; i++) { read_data<<= 1; cs1237_clk_high(); delay_us(1); cs1237_clk_low(); if(gpio_input_bit_get(GPIOE,GPIO_PIN_4)) read_data++; delay_us(1); } // 第25,26,27个时钟 for(i = 0; i < 3; i ++) { cs1237_clk_high(); delay_us(1); cs1237_clk_low(); delay_us(1); } return read_data; } } ``` 哎程序读取完成但是还需要配置啊,放弃只读取的函数吧重新写一个 ![QQ图片20220116104157.png](https://oss-club.rt-thread.org/uploads/20220116/42d15cfe4573285393a3aa094a75554e.png.webp) ![QQ图片20220116104205.png](https://oss-club.rt-thread.org/uploads/20220116/810648c150284c07d24e764271d589ce.png.webp) ``` int32_t cs1237_oper(int32_t *read_data, uint8_t command, uint8_t *register) { uint8_t i; int32_t ad_data = 0; uint8_t byte_temp; if(! gpio_input_bit_get(GPIOE,GPIO_PIN_4)) { //1-24个SCLK,读取ADC的转换结果 for(i=1; i<=24; i++) { ad_data <<= 1; cs1237_clk_high(); delay_us(1); cs1237_clk_low(); if(gpio_input_bit_get(GPIOE,GPIO_PIN_4)) ad_data++; delay_us(1); } // 第25,26,27个时钟 for(i = 0; i < 3; i ++) { cs1237_clk_high(); delay_us(1); cs1237_clk_low(); delay_us(1); } if(read_data) *read_data = ad_data; } else { return -1; } // 数据读取完成,配置CS1237 if(command) { if(register == NULL) return -2; // 第28,29个时钟,直接跳过 for(i = 0; i < 2; i ++) { cs1237_clk_high(); delay_us(1); cs1237_clk_low(); delay_us(1); } // 第30~36个时钟,写寄存器操作命令 byte_temp = command; for(i = 0; i < 7; i ++) { cs1237_clk_high(); if(byte_temp & 0x40) gpio_bit_set(GPIOE, GPIO_PIN_5); else gpio_bit_reset(GPIOE, GPIO_PIN_5); delay_us(1); cs1237_clk_low(); delay_us(1); byte_temp <<= 1; } // 第37个时钟,芯片自动切换引脚状态 cs1237_clk_high(); delay_us(1); cs1237_clk_low(); delay_us(1); // 第38~45个时钟,输出或者读取寄存器的状态 if(command == 0x65) { // 写配置寄存器 byte_temp = *register; for(i = 0; i < 8; i ++) { cs1237_clk_high(); if(byte_temp & 0x80) gpio_bit_set(GPIOE, GPIO_PIN_5); else gpio_bit_reset(GPIOE, GPIO_PIN_5); delay_us(1); cs1237_clk_low(); delay_us(1); byte_temp <<= 1; } } else if(command == 0x56) { // 读配置寄存器 byte_temp = 0; for(i = 0; i < 8; i ++) { byte_temp <<= 1; cs1237_clk_high(); delay_us(1); cs1237_clk_low(); if(gpio_input_bit_get(GPIOE,GPIO_PIN_4)) byte_temp ++; delay_us(1); } *register = byte_temp; } else return -3; // 第46个时钟,CS1237切换为输出 cs1237_clk_high(); delay_us(1); cs1237_clk_low(); delay_us(1); } return 0; } ```
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
嚜軒公告
努力中
文章
9
回答
205
被采纳
7
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
5
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
11
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部