最近用到CS1237(24位ADC)采集锂电池电压,也是本人第一次用Verilog自己按照数据手册的时序图写通讯协议,内容可能会有不足之处,也欢迎大家在评论区指正。
话不多说,开始整活
(CS1237数据手册的时序图我就不贴了,大家如果要用这个芯片,最开始肯定有找数据手册)
硬件电路图:
正采集端用电阻分压的原因是,芯片自己的数据转换公式里会给基准电压除2 ,为方便数据处理,硬件上做个电阻分压。
Verilog代码:
module CS1237
(
input wire sys_clk , //系统时钟,频率25MHz
input wire sys_rst_n , //复位信号,低电平有效
inout reg adc , //数据端口
output reg sclk , //时钟端口
output reg [7:0] bat_power
);
parameter S_STOP = 3'd0, //时钟高电平,休眠状态
S_WAIT_R = 3'd1, //时钟低电平,等待数据转换完成
S_READ = 3'd2, //1-24时钟,读取数据
S_WAIT_W = 3'd3, //25-29时钟,准备写
S_WRITE = 3'd4, //30-37时钟,发送写寄存器指令,37时钟用于过渡
S_CONFIG = 3'd5; //38-47时钟,写寄存器,47时钟是为了让46时钟完整
parameter T_STOP = 8'd250; //us,休眠状态时长,根据自己需求修改
reg [2:0] state ; //状态机状态
reg adc_d1 ; //总线信号打一拍
wire adc_fall ; //总线下降沿
reg [4:0] cnt ; //时钟分频计数器
reg clk_1us ; //1us时钟
reg [7:0] cnt_us ; //us计数器
reg en_sclk ; //输出时钟使能
reg [5:0] bit_cnt ;