{
IOWR_32DIRECT(SPI_BASE,12,0xc0)/裤则/bit6 bit7 置1使能发送接收等待标志
IOWR_32DIRECT(SPI_BASE,8,0x60)//bit5 传输散型移位寄存器空标志 bit6 发送等待
}
alt_u8 spi_process(alt_u8 txdata)
{
alt_u8 rxdata
alt_u32 spi_status_reg
//发送数据
do{
spi_status_reg = IORD_32DIRECT(SPI_BASE,8)
}while((spi_status_reg &0x40) != 0x40)
IOWR_32DIRECT(SPI_BASE,4,txdata)
//接收数据
do{
spi_status_reg = IORD_32DIRECT(SPI_BASE,8)
}while((spi_status_reg &0x80) != 0x80)
rxdata = IORD_32DIRECT(SPI_BASE,0)
return rxdata}
有这两胡掘棚个基本函数就可以通讯了,剩下的就要看你的陀螺仪的手册进行配置...
用时钟采样输入的数据,比较最后两次采样值,如果汪汪发生了变化,就产生一个开始发送的内部信号start_tx。然后用这个start_tx启动你的RS-232模块,把data_reg2分25个困轿仔byte发送出去。下面只是个简单的VHDL(Verilog很类似)例子,如果实际应用要考虑一些保护。比如,正在传输的时候,外部数据又发生变化了怎么办等等。如有困难,可再来讨论。
signal data_reg1, data_reg2 : std_logic_vector(199 downto 0)
signal start_tx : std_logic
begin
process(reset_n, clk)
begin
if reset_n = '0' then
data_reg1 <= (others =>'0')
data_reg2 <= (others =>'0')
start_tx <= '0'
elsif rising_edge(clk) then
data_reg1 <= datain
data_reg2 <= data_reg1
if data_reg1 /= data_reg2 then
start_tx <= '1'
else
start_tx <= '0'
end if
end if
end process
---------------------------------
收到我的留言了么?
---------------------------------
我给你的那段为了解决如何检查出外部信号发生改变了,就是产生start_tx脉冲。
接下来要做的事情很简单,用一个计数器,start_tx=1时,就设为25,表示还有25个byte等待发送。然后就看RS-232是否空闲,是就发送一个byte,同时计数器减1。一直到计数器为0停止。根据计数器的值,可以决定送哪个byte出去。
用通用的RS-232模块可以啊,不知道你用的哪种,但关键是你要知道如何使用。你用的RS-232模块如果是自带FIFO的,那只要看FIFO的满标记 full flag,只要不满,就可以往里写。如果是不带FIFO的,它必定有一帆举个信号表示发送结束的,你就可以每次等它结束,再写下一个byte。
如果思路上还有什么不清楚的,继续给我留言。
程序嘛,个人认为VHDL和Verilog大同小异。我就不再给你写了,自己编写、调试,乐趣更大不是么。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)