有个问题困扰我块半个月,实在解决不了,请求高手帮忙。
方案是:利用DMA,实现从RS232发送数据,SDRAM接收数据,然后通过串口检查是不是我发送的信息,检查方式通过上位机串口调试软件发送信息,然后将发送出去的信息,并传回到JTAG端和RS232端(此时RS232端通过文件显示输出)。
问题:怎么也得不到我发送出去的信息,返回的数据跟发送的数据不一致,或者发送不出去。(另一个程序从SDRAM发送到串口是OK的,说明串口没问题),版本10.0+NIOS 10.0
程序代码:
//从RS232接收字符,传到SDRAM,在将所传送的信息,反馈到JTAG和RS232(通过文件形式),检查两者是否正确
//从RS232接收字符,传到SDRAM,在将所传送的信息,反馈到JTAG和RS232(通过文件形式),检查两者是否正确
#include <stdio.h>
#include <stdlib.h>
#include "sys/alt_dma.h"
#include "altera_avalon_uart_regs.h"
#include "altera_avalon_dma_regs.h"
#include "system.h"
#include "alt_types.h"
#include <string.h>
#define TRANSFER_LENGTH 1024
static volatile int tx_done = 0;
static char str[512]={"this is str data\n"};
//回调函数
static void done (void* handle)
{
tx_done++;
}
int main()
{
alt_u8 i;
FILE *fp_LCD=0;
FILE *fp_RS232=0;
fp_LCD = fopen("/dev/lcd","w");
fp_RS232 = fopen("/dev/rs232","w");
int rc;
alt_dma_rxchan rxchan;
void* source = (void*)IOADDR_ALTERA_AVALON_UART_TXDATA(RS232_BASE);/* 源地址 */
void* dest = (void*)(SDRAM_BASE+100);
/* 打开发送通道 */
if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == 0)
{ printf ("successful to open transmit channel\n");
exit (1);
}
/* 设置发送地址固定 */
if ((rc = alt_dma_rxchan_ioctl(rxchan, ALT_DMA_RX_ONLY_ON, source)) < 0)
{ printf ("Failed to set ioctl, reason = %i\n", rc);
exit (1);
}
//设置每次接收一个字节,即8位,因为UART每次只发送8位
if((rc = alt_dma_rxchan_ioctl(rxchan,ALT_DMA_SET_MODE_8 ,NULL))<0)
{ printf("Failed to set mode 8\n");
exit(1);
}
/* 开始接收 */
if ((rc = alt_dma_rxchan_prepare(rxchan, SDRAM_BASE+100, 32, done, NULL)) < 0)
{ printf ("Failed to post transmit request, reason = %i\n", rc);
exit (1);
}
/* 等待接收结束 */
while (!tx_done);
printf ("Transfer to jtag!\n");
fprintf(fp_LCD,"Transfer to lcd! \n");
fprintf(fp_RS232,"Transfer to rs232 ! \n");
//alt_dma_rxchan_close(rxchan);
memcpy(str,SDRAM_BASE+100,256); // 将SDRAM内容复制到ONCHIP str,并显示输出,以便检查
printf ("%x\n",str);
fprintf(fp_LCD,str);
fprintf(fp_RS232,str);
printf("%x\n",SDRAM_BASE+100);
alt_dma_rxchan_close(rxchan);
return 0;
}