用FPGA做陀螺的信号采集,SOPC中用的是SPI总线,在Nios II中程序怎么写?

用FPGA做陀螺的信号采集,SOPC中用的是SPI总线,在Nios II中程序怎么写?,第1张

void init_spi(void)

{

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大同小异。我就不再给你写了,自己编写、调试,乐趣更大不是么。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12419622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存