使用这个芯片与fpga通过uppA进行通信,dsp这把发送数据,fpga接收数据,但是每次都只有时钟信号没有数据。
/*
* main.c
*/
#include <stdio.h>
#include <c6x.h>
#include "soc_C6748.h" // DSP C6748 外设寄存器
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
#include "interrupt.h" // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
#include "uartStdio.h" // 串口标准输入输出终端函数声明
#include "upp.h" // 通用并行端口设备抽象层函数声明
#include "dspcache.h"
// 全局变量
volatile int upp_error_count = 0;
volatile int upp_interrupt_count = 0;
// 使用缓存
#define CacheEnabled 1
// 配置
#define upp_line_size (128)
#define upp_line_count (1)
#define upp_frame_size (upp_line_size * upp_line_count)
#define upp_line_offset (upp_line_size)
// 接收 / 发送缓存变量
#pragma DATA_ALIGN(upp_buffer_a, 8)//64位对齐,一个字节8位,8*8=64
unsigned short upp_buffer_a[upp_frame_size];
// 通道参数
uPPDMAConfig transposeParA;
void OmaplFpgauPPSetup(void)
{
// 外设使能
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UPP, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
// 引脚复用配置
uPPPinMuxSetup(uPP_CHA_16BIT);
// uPP复位
uPPReset(SOC_UPP_0_REGS);
// 数据格式配置
uPPDataFmtConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_DataPackingFmt_LJZE | uPP_DataPacking_FULL
| uPP_InterfaceWidth_16BIT | uPP_DataRate_SINGLE);
// 通道配置
uPPChannelConfig(SOC_UPP_0_REGS, uPP_DDRDEMUX_DISABLE | uPP_SDRTXIL_DISABLE | uPP_CHN_ONE
| uPP_ALL_TRANSMIT);
// 引脚配置
uPPPinConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_PIN_ENABLE | uPP_PIN_WAIT | uPP_PIN_START);
// 时钟配置
// uPPCLK = (CPUCLK / 2) / (2 * (DIV + 1) (DIV = 0, 1, 2, 3 ... 15)
// 456MHz 主频下支持的时钟 114MHz、57MHz、38MHz、28.5MHz、22.8MHz ......
uPPClkConfig(SOC_UPP_0_REGS, uPP_CHA, 57000000/2, 228000000/2, uPP_PIN_PHASE_NORMAL);
// 空闲输出配置
uPPIdleValueConfig(SOC_UPP_0_REGS, uPP_CHA, 0xAAAA);
// uPP使能
uPPEnable(SOC_UPP_0_REGS);
}
void main(void)
{
int i,target_int_count = 2;
if(CacheEnabled)
{
// 使能缓存
CacheEnableMAR((unsigned int)0xC0000000, (unsigned int)0x10000000);//一个地址一个字节
CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K | L2CFG_L2MODE_256K);
}
// uPP 外设初始化
OmaplFpgauPPSetup();
// A 通道参数 接收
transposeParA.WindowAddress = (unsigned int *)((int)upp_buffer_a);
transposeParA.LineCount = upp_line_count;
transposeParA.ByteCount = (upp_line_size*sizeof(unsigned short));
transposeParA.LineOffsetAddress = (upp_line_offset*sizeof(unsigned short));
while(1)
{
upp_error_count = 0;
upp_interrupt_count = 0;
for (i = 0; i < upp_frame_size; i++)
{
upp_buffer_a[i] = i;
}
if(CacheEnabled)
{
CacheWB ((unsigned int)upp_buffer_a, sizeof(upp_buffer_a));
}
// uPP A 通道启动发送
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &transposeParA);
// 等待 uPP 传输完毕
while (upp_interrupt_count < target_int_count && upp_error_count == 0)
{
}
}
}
这个000e是我uppA在nand flash状态下的值