0

我正在尝试为 SDI-12 协议编写代码

SDI-12的字节帧格式是

  • 1 个起始位
  • 7 个数据位,首先传输最低有效位
  • 1个奇偶校验位,偶校验
  • 1 个停止位

我想传输 24 位数据,即100001101011001010000100

当排列在框架中时看起来像

开始,1000011,P,停止,开始,0101100,P,停止,开始,1010000,P,停止,开始,100_ _ _ _,P,停止

其中 P 是奇偶校验位

问题是:

  • 我应该在最后四位传输什么数据,即_ _ _ _
  • 我怎么知道要发送的数据已经完成?

代码:

 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;
4

2 回答 2

0

我应该在最后传输什么数据,即_ _ _ _

为什么不用 0 填充您的输入数据,直到长度为 7 个数据位的下一个倍数?

于 2012-08-21T11:03:46.287 回答
0

你的方法不正确。您确实了解 SDI-12 的字节帧格式,但您还应该了解要传输到 SDI-12 传感器的 SDI-12 命令。

所有 SDI-12 命令均由 ASCII 字符组成,使用 1 个起始位、7 个数据位、1 个奇偶校验位(偶数)和 1 个停止位的字节帧格式传输。

您似乎正在尝试将“C,P”加上 3 个额外位传输到 SDI-12 传感器。根据 SDI-12 规范,这是无效的。用另外 4 位填充 3 个额外位(它们是做什么用的?)只是为了达到 7 位是没有意义的,并且“C,P”不是有效的 SDI-12 命令(除非传感器地址是“C”并且",P" 是 SDI-12 扩展命令,这是另一个话题)。

您需要将有效的 SDI-12 命令传输到 SDI-12 传感器。

SDI-12 命令的第一个字符始终是传感器地址,它是单个可打印的 ASCII 字符。SDI-12 命令的最后一个字符是“!” (ASCII 33 十进制)。

来自传感器的响应以回车/换行对终止(ASCII 13 十进制 + ASCII 10 十进制)。

最简单的 SDI-12 命令是确认活动命令。此命令用于查看特定传感器是否连接到 SDI-12 总线。

例如,如果传感器的地址是“0”(ASCII 32 十进制),Acknowledge Active 命令是:

0!

如果它以正确的字节帧格式传输到 SDI-12 传感器,以 1200 波特,符合 SDI-12 规范的电气要求,并且如果地址为“0”的传感器在另一端,您将从传感器获取此响应:

0<CR><LF>

SDI-12 规范列出了所有有效的 SDI-12 命令。您可以在以下网址获得一份副本: www.sdi-12.org

于 2014-02-11T17:07:38.170 回答