
{
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}
有这两个基本函数就可以通讯了,剩下的就要看你的陀螺仪的手册进行配置...
最近使用NIOSII的DMA的方式来实现用SPI发送数据,具体方式是用NIOSII将UART的数据接收,当它接收到一定数量的数据后使用DMA方式将数据发送出去。出现的问题:一开始我们使用NIOSII的e核,将程序放到外部的SRAM中,结果发现SPI的发送速度跟不上DSP要求的速度。NIOSII的SPI核设定为slave模式,DSP的主SPI的访问速度为10M。
然后我们就觉得是DMA与CPU强占总线造成速度不够,应为我们将接收的数放到外部的SRAM中,同时程序也运行在外部SRAM。我们就开辟了新的存数据的空间,具体做法是:
在IDE的system library property中将Stack memory指定为on chip memory ,然后在程序中用
#pragma DATA_SECTION( uart2_data,".ON_CHIP_RAM")
alt_u16 uart2_data[LENGTH+2]//uart2 to spi buffer
将存储空间指定到on chip memory上 结果发现如果程序中只有使用DMA发送SPI数据时可以实现,如果还有其他任务时,就不能实现正确发送数据。
同时我们还发现如果将DMA的目的端指定了两个,造成的结果
就是在程序中用txchan = alt_dma_txchan_open("/dev/dma_0")打不开DMA。
问题的解决:由于以上的原因,我们初步认为是DMA与CPU抢占工作时间,同时NIOSII的指令工作速度不够快造成的,我们决定将NIOSII换成s核,
先使用on chip memory 来实现发送数据的存储,DMA从on chip memory 源端发送到SPI 目的端,结果发现能够正确发送,
然后我们又尝试将数据放到SRAM中发现也能够正确的发送数据。
DMA的使用方法:在IDE程序中使用DMA的方法如下:
txchan = alt_dma_txchan_open("/dev/dma_0")//打开DMA发送通道
alt_dma_txchan_ioctl(txchan, ALT_DMA_TX_ONLY_ON, (void *)(SPI_BASE+2))//将目的端设定为固定在SPI的TXDATA寄存器
IOCTL函数的使用参考本日志中的NIOSII常用函数函数
alt_dma_txchan_ioctl(txchan, ALT_DMA_SET_MODE_16,(void*)NULL)//将DMA的发送方式设定为16位模式,此处应该注意DMA的LENGTH计数是以8位来计数的
在设定DMA的发送个数时应该×2
alt_dma_txchan_send(txchan,(void *)&uart2_data,c_counter*2,uart2Done,NULL)
NIOSII 中的SPI的ROE和WOE需要及时清除,否则会造成SPI阻塞。IOWR_ALTERA_AVALON_SPI_STATUS(SPI_BASE,0x18)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)