我正在尝试为SDI-12协议编写代码
SDI-12的字节帧格式是
我想传输24位数据,即100001101011001010000100
当在框架中排列时看起来像
开始,1000011,P,停止,开始,0101100,P,停止,开始,1010000,P,停止,开始,100_ _ _ _,P,停止
其中P是奇偶校验位
问题是:CODE:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity serialtx is
generic (data_width : integer);
port (clk, reset : in std_logic;
tx_data : in std_logic_vector(data_width-1 downto 0);
tx_out : out std_logic
);
end serialtx;
architecture behavioral of serialtx is
type ofstate is (IDLE, START_bit, STOP_bit);
signal state, nextstate : ofstate;
signal parity_bit, tx_enable : std_logic;
begin
process
variable count, p_val : integer := 0;
begin
if(clk'event and clk = '1' and tx_enable = '1')then
if(reset = '1')then
tx_out <= '0';
else
case state is
when IDLE =>
tx_out <= '0';
nextstate <= START_bit;
when START_bit =>
count := count+1;
if(count >= 0 and count < 7)then
for b in p_val to data_width-1 loop
tx_out <= tx_data(p_val);
end loop;
elsif(count = 7)then
tx_out <= parity_bit;
p_val := p_val+1;
elsif(count = 8) then
tx_out <= '1';
nextstate <= STOP_bit;
count := 0;
end if;
when STOP_bit =>
--if--data to be sent is completed then
tx_out <= '1';
tx_enable <= '0';
--else
nextstate <= IDLE;
--end if;
end case;
end if;
end if;
end process;
end behavioral;
答案 0 :(得分:0)
我应该在最后一位传输哪些数据,即_,_ _ _
为什么不用0填充输入数据,直到7个数据位的下一个倍数?
答案 1 :(得分:0)
您的方法不正确。您了解SDI-12的字节帧格式,但您还应该了解要传输到SDI-12传感器的SDI-12命令。
所有SDI-12命令都由ASCII字符组成,使用1个起始位的字节帧格式,7个数据位,1个奇偶校验位(偶数)和1个停止位进行传输。
您似乎正在尝试将“C,P”加3个额外位传输到SDI-12传感器。根据SDI-12规范,这是无效的。将4个额外位(它们用于什么?)填充4位以获得7位是没有意义的,“C,P”不是有效的SDI-12命令(除非传感器地址为“C”且“,P”是SDI-12扩展命令,这是另一个主题。)
您需要将有效的SDI-12命令发送到SDI-12传感器。
SDI-12命令的第一个字符始终是传感器地址,它是一个可打印的ASCII字符。 SDI-12命令的最后一个字符是“!” (ASCII十进制33)。
来自传感器的响应以回车符/换行符对终止(ASCII 13十进制+ ASCII十进制十进制)。
最简单的SDI-12命令是Acknowledge Active Command。此命令用于查看特定传感器是否连接到SDI-12总线。
例如,如果传感器的地址为“0”(ASCII 32十进制),则“确认激活”命令为:
0!
如果以正确的字节帧格式传输到SDI-12传感器,则为1200波特,符合SDI-12规范的电气要求,如果传感器的地址为“0”则位于另一端,您将从传感器获得此响应:
0<CR><LF>
SDI-12规范列出了所有有效的SDI-12命令。您可以在www.sdi-12.org找到它的副本。