前言:
在正点原子uart数据包收发实验例程修改---uart通信verilog实现1中详细介绍了如何修改接收模块,以便于接收到更多的数据信息。但在实际应用中不只有接收信息操作,也有发送信息操作的需求。本文主要介绍如何修改packet_code发送模块中的查询按键状态,使得按下按键能够发送多种信息。
步骤1:对按键进行消抖处理。正点原子的教程中有详细介绍。
步骤2:在packet_code模块中进行修改
修改1:添加按键按下次数计数器模块。
reg [7:0] arm_startr = 8'd0;
wire [7:0] arm_startw;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) arm_startr <= 8'd0;
else if (neg_key_filter) begin
//有效的一次按键被按下
if (arm_startr <8'd4) begin
arm_startr <= arm_startr + 8'd1;
end else begin
arm_startr <= 8'd0;
end end
else arm_startr <= arm_startr;
end
assign arm_startw = arm_startr;
修改2:找该always所在处根据自己的需求进行修改,以下为参考。
//打包发送给上位机的数据包
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
uart_packet_data <= {32'd0,PACKET_HEAD};
else if (parse_done)begin
if (packet_len == 8'd3) begin
if (parse_result == PARSE_OK) begin //发送解析正确数据包
uart_packet_data[15:8] <= parse_cmd;
uart_packet_data[23:16] <= PACKET_HEAD + parse_cmd; //计算校验和
end
else begin
uart_packet_data[15:8] <= parse_result; //发送解析错误数据包
uart_packet_data[23:16] <= PACKET_HEAD + parse_result;
end
end
else begin
//-----------------------修改处---------------------
uart_packet_data[15:8] <= parse_cmd;
uart_packet_data[23:16] <= 8'h01; //发送查询结果数据包
if (arm_startw == 8'd1)begin
uart_packet_data[31:24] <= {4'b0,1'b0,3'd2};//修改处1---数据
uart_packet_data[39:32] <= PACKET_HEAD + parse_cmd + 8'h01 + {4'b0,1'b0,3'd2};//修改处1----校验
end else if (arm_startw == 8'd2)begin
uart_packet_data[31:24] <= {4'b0,1'b0,3'd2};
uart_packet_data[39:32] <= PACKET_HEAD + parse_cmd + 8'h01 + {4'b0,1'b0,3'd2};
end else if (arm_startw == 8'd3)begin
uart_packet_data[31:24] <= {4'b0,1'b0,3'd3};
uart_packet_data[39:32] <= PACKET_HEAD + parse_cmd + 8'h01 + {4'b0,1'b0,3'd3};
end
else begin
uart_packet_data[31:24] <= {4'b0,3'b0,1'b1};
uart_packet_data[39:32] <= PACKET_HEAD + parse_cmd + 8'h01 + {4'b0,3'b0,1'b1};
end
//-----------------------修改处---------------------
end
end
end
结尾:
其实发送模块不应该只是这么修改的,修改的地方还有很多,但因为我最近比较忙,没能进行相关测试,因此不在这过多的介绍。如果有需要的可以私聊,分享与交流自己的想法。
1421

被折叠的 条评论
为什么被折叠?



