G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35
//--------------------------------------------------------------------------------------------
-
//DSP28377 利用EMIF控制网口DM9000芯片收发数据
//--------------------------------------------------------------------------------------------
-
#include "F28x_Project.h" // Device Headerfile and Examples Include File
void Emif1Initialize(void);
//emif 映射地址
#define ASRAM_CS3_START_ADDR 0x37FFF0
#define ASRAM_CS3_SIZE 0x8000
extern void setup_emif1_pinmux_async_16bit(Uint16);
//地址指定;通过操作指针实现地址对应数据操作
Uint16 *ADDR_POINT = (Uint16 *)(ASRAM_CS3_START_ADDR);
Uint16 *DATA_POINT = (Uint16 *)(ASRAM_CS3_START_ADDR + 1);
#define EMIF1 0
//##########DM9000 SETING ######################
#define DM_NCR 0X00
#define DM_NSR 0X01
#define DM_TCR 0X02
#define DM_RCR 0X05
#define DM_BPTR 0X08
#define DM_FCTR 0X09
#define DM_RTFCR 0X0A
#define DM_EPCR 0X0B
#define DM_EPAR 0X0C
#define DM_EPDRL 0X0D
#define DM_EPDRH 0X0E
#define DM_PAB0 0X10
#define DM_PAB1 0X11
#define DM_PAB2 0X12
#define DM_PAB3 0X13
#define DM_PAB4 0X14
#define DM_PAB5 0X15
#define DM_GPCR 0X1E
#define DM_GPR 0X1F
#define DM_SMCR 0X2F
#define DM_MRCMDX 0XF0
#define DM_MRCMD 0XF2
#define DM_MWCMD 0XF8
#define DM_TXPLH 0XFD
#define DM_TXPLL 0XFC
#define DM_ISR 0XFE
#define DM_IMR 0XFF
#define PHY_BADDR 0X40
#define PHY_WCMD 0X0A
#define PHY_RCMD 0X0C
Uint16 NODE_ADDR[6] = {0X5A , 0X5A , 0X5A , 0X5A , 0X5A , 0X5A};
Uint16 databuffer[540];
Uint16 buffersize = 520;
//---------------------------------------------------------------------
// 向DM9000内部寄存器写值
void iow(Uint16 IOADDR , Uint16 REGDARA){
*ADDR_POINT = IOADDR;
DELAY_US(20);
*DATA_POINT = REGDARA;
-1-
G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35
DELAY_US(20);
}
//---------------------------------------------------------------------
// 读取DM9000内部寄存器的值
Uint16 ior(Uint16 IOADDR){
DELAY_US(20);
*ADDR_POINT = IOADDR;
DELAY_US(20);
return(*DATA_POINT);
}
//---------------------------------------------------------------------
// 往固定地址写值
void outw(Uint16 REGDATA , Uint16 addr_data_type){
if(addr_data_type == 1) *DATA_POINT = REGDATA;
else if(addr_data_type == 2) *ADDR_POINT = REGDATA;
DELAY_US(50);
}
//---------------------------------------------------------------------
//读取寄存器的值
Uint16 inw(){
return *DATA_POINT;
}
//---------------------------------------------------------------------
//写物理接口PHY寄存器的值
void phy_write(Uint16 offset , Uint16 REGIN){
iow(DM_EPAR , (offset | PHY_BADDR));
iow(DM_EPDRH , (REGIN >> 8) & 0x00ff);
iow(DM_EPDRL , (REGIN & 0x00ff));
iow(DM_EPCR , PHY_WCMD);
while((ior(DM_EPCR) & 1));
DELAY_US(200);
iow(DM_EPCR , 0x08);
}
//---------------------------------------------------------------------
//读物理接口PHY寄存器的值
Uint16 phy_reaad(Uint16 offset , Uint16 REGIN){
Uint16 returndata=0;
iow(DM_EPAR , (offset | PHY_BADDR));
-2-
G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35
iow(DM_EPCR , PHY_RCMD);
while((ior(DM_EPCR) & 1));
DELAY_US(200);
iow(DM_EPCR , 0x08);
returndata = ior(DM_EPDRH);
returndata = (returndata << 8) | ior(DM_EPDRL);
return returndata;
}
//---------------------------------------------------------------------
//DM9000 初始化
void DM9000_INIT(){
//开启PHY
iow(DM_GPR , 0X00);
//softerware reset and setting as normal mode(TWICE)
iow(DM_NCR , 0X01);
DELAY_US(10000);
iow(DM_NCR , 0X00);
iow(DM_NCR , 0X01);
DELAY_US(10000);
iow(DM_NCR , 0X00);
//clear the RX/TX flag
iow(DM_NSR, 0x2C);
iow(DM_ISR, 0x3F);
// //write the NODE_ADDR to physical register
iow(DM_PAB0 , NODE_ADDR[0]);
iow(DM_PAB1 , NODE_ADDR[1]);
iow(DM_PAB2 , NODE_ADDR[2]);
iow(DM_PAB3 , NODE_ADDR[3]);
iow(DM_PAB4 , NODE_ADDR[4]);
iow(DM_PAB5 , NODE_ADDR[5]);
//Eenable RX/TX function
iow(DM_RCR , 0x31);//去掉混杂模式//iow(DM_RCR , 0x31);
iow(DM_TCR , 0x00);
//setting phy of dm9000
phy_write(0x00 , 0x8000);
DELAY_US(100000);
phy_write(0x04 , 0x01e1 | 0x0400);
DELAY_US(100000);
//set back presure threshold register
iow(DM_BPTR , 0x3F);
iow(DM_FCTR , 0x3A);
iow(DM_RTFCR , 0xFF);
iow(DM_SMCR , 0x00);
//clear all flags agin
iow(DM_NSR, 0x2C);
iow(DM_ISR, 0x3B);
//open the rx interrupt
iow(DM_IMR , 0x81);
-3-
G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35
DELAY_US(1000);
}
//--------------------------------------------------------------------------------------
//发送网络包
void PACKE_SEND(Uint16 *datain , Uint16 datalen){
Uint16 i = 0;
Uint16 len=0;
//关闭RX中断
iow(DM_IMR , 0x80);
//write length to internal sram
//将包的长度写入到寄存器中;
len = datalen * 2;
iow(DM_TXPLH , ((len&0xff00)>>8));
iow(DM_TXPLL , len&0x00ff);
//DM_MWCMD is pointer to internal TX sdram address
outw(DM_MWCMD , 2);
//write data int internal sram
for(i = 0; i < datalen ; i++) outw(datain[i] , 1);
//start transmit
iow(DM_TCR , 0X01);
// wait transmit complit
while((ior(DM_NSR) & 0x0c) == 0);
DELAY_US(20);
//clear the tx flag
iow(DM_NSR , 0X2C);
//oprn rx intterupt
iow(DM_IMR , 0x81);
}
//----------------------------------------------------------------------------------------
//接受网络包
//在调试的过程中;通过一片DSP发送1040个数据(8bit);并设置发送长度为1040;但对于接受的网络包
而言;不仅仅会在接收到的网络包前包含4个
//信息byte;分别是接受准备;接受状态位;帧长度(2byte);后面跟随1040个数据(byte);后面还会
跟随4个byte位;作用不知;同时接受到的
//帧长度为1044个;所以在读取数据是必须读取完成整个1044个数据;rx指针才会自动跳转到SRAM的首地址
等待下一次触发
void PACKE_RECIVE(Uint16 *datain , Uint16 datalen){
Uint16 i = 0;
Uint16 rx_length = 0;
Uint16 rx_status = 0;
Uint16 state = 0;
Uint16 ready = 0;
//获取中断标识
state = ior(DM_ISR);
if(state & 0x01){
//清除中断标志
iow(DM_ISR , 0x01);
//将rx指针指向SRAM(此指针的指向方式为读取数据后指针不会自动增加)
-4-
G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35
ready = ior(DM_MRCMDX);
DELAY_US(200);
//在读取一次状态寄存器
ready = ior(DM_MRCMDX);
//取状态寄存器的低8位
ready = ready & 0X00FF;
if(ready == 0x01){
//将rx指针指向SRAM(此指针的指向方式为读取数据后指针会自动增加)
outw(DM_MRCMD , 2);
//读取状态信息
rx_status = inw();
//读取帧字节数
rx_length = inw();
//获取数据
if((rx_length % 2) == 1) rx_length = rx_length + 1;
for(i=0;i<rx_length/2;i++){
*(datain + i) = inw();
}
ESTOP0;
}
else if(ready == 0x00)
{
/*iow(DM_IMR , 0x80);
iow(DM_ISR , 0x0F);
iow(DM_RCR , 0x00);
iow(DM_NCR , 0x01);
DELAY_US(20);
iow(DM_NSR, 0x2C);
iow(DM_ISR, 0x80);
iow(DM_RCR, 0x39);*/
ESTOP0;
}
}
iow(DM_ISR , 0x01);
iow(DM_IMR , 0x81);
}
void main(void)
{
Uint16 i = 0;
Uint16 datalen = 0;
InitSysCtrl();
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the F2837xD_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
EALLOW;
IER = 0x0000;
IFR = 0x0000;
EDIS;
// Initialize the PIE vector table with pointers to the shell Interrupt
// GService Routines (ISR).
-5-
G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in F2837xD_DefaultIsr.c.
// This function is found in F2837xD_PieVect.c.
InitPieVectTable();
Emif1Initialize();
//Configure to run EMIF1 on full Rate (EMIF1CLK = CPU1SYSCLK)
EALLOW;
ClkCfgRegs.PERCLKDIVSEL.bit.EMIF1CLKDIV = 0x1;
EDIS;
EALLOW;
//Grab EMIF1 For CPU1
Emif1ConfigRegs.EMIF1MSEL.all = 0x93A5CE71;
//Disable Access Protection (CPU_FETCH/CPU_WR/DMA_WR)
Emif1ConfigRegs.EMIF1ACCPROT0.all = 0x0;
if (Emif1ConfigRegs.EMIF1ACCPROT0.all != 0x0)
{
while(1);
}
// Commit the configuration related to protection. Till this bit remains set
// content of EMIF1ACCPROT0 register can't be changed.
Emif1ConfigRegs.EMIF1COMMIT.all = 0x1;
if(Emif1ConfigRegs.EMIF1COMMIT.all != 0x1)
{
while(1);
}
// Lock the configuration so that EMIF1COMMIT register can't be changed any more.
Emif1ConfigRegs.EMIF1LOCK.all = 0x1;
if (Emif1ConfigRegs.EMIF1LOCK.all != 1)
{
while(1);
}
//
EDIS;
//
// //Configure GPIO pins for EMIF1
setup_emif1_pinmux_async_16bit(0);
//
// //Configure the access timing for CS2 space
//net
Emif1Regs.ASYNC_CS3_CR.all = ( EMIF_ASYNC_ASIZE_16 | // 16Bit Memory Interface
EMIF_ASYNC_TA_3 | // Turn Around time of 2 Emif
Clock
EMIF_ASYNC_RHOLD_1 | // Read Hold time of 1 Emif
Clock
EMIF_ASYNC_RSTROBE_5 | // Read Strobe time of 4 Emif
Clock
EMIF_ASYNC_RSETUP_1 | // Read Setup time of 1 Emif
Clock
EMIF_ASYNC_WHOLD_1 | // Write Hold time of 1 Emif
Clock
EMIF_ASYNC_WSTROBE_2 | // Write Strobe time of 1 Emif
Clock
EMIF_ASYNC_WSETUP_1 | // Write Setup time of 1 Emif
Clock
EMIF_ASYNC_EW_DISABLE | // Extended Wait Disable.
EMIF_ASYNC_SS_DISABLE // Strobe Select Mode Disable.
);
DELAY_US(500000);
DM9000_INIT();
DELAY_US(500000);
-6-
G:\controlSUITE\device_support\F2837xD\v180\F2837xD_examples_Cpu1\emif1_16bit_asram\cpu01\emif1_16bit_asram.c 2016年11月22日 20:35
//********************************************************************
//接受数据测试段代码
//******************************************************************
// for(i=0;i<520;i++){
// databuffer[i] = 0;
// }
//
// while(1){
// PACKE_RECIVE(&databuffer[0] , 520);
//
// if(datalen > 10) ESTOP0;
// }
//*************************************************************************
//发送数据测试段代码
//*************************************************************************
databuffer[0] = 0xFFFF; databuffer[1] = 0xFFFF; databuffer[2] = 0xFFFF;
databuffer[3] = 0x285B; databuffer[4] = 0xC92D; databuffer[5] = 0x587D;
databuffer[6] = 0X00;databuffer[7]=0X00;
for(i = 0 ; i< 512 ; i++){
databuffer[i+8] = i;
}
while(1){
PACKE_SEND(&databuffer[0] , buffersize);
DELAY_US(1000);
}
}
-7-

dsp28377控制DM9000收发数据——第二版程序,能够实现手术功能,但是容易掉帧;使用读取中断寄存器的方式判断中断的更多相关文章

  1. dsp28377控制DM9000收发数据——第三版程序,通过外部引脚触发来实现中断接受数据,优化掉帧现象

    //-------------------------------------------------------------------------------------------- - //D ...

  2. dsp28377控制DM9000收发数据

    首先感谢上一篇转载文章的作者给出的参考,下面是一些自己在调试过程中的一些步骤: 首先把代码贴上来: //------------------------------------------------ ...

  3. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  4. 汇编语言第二版 程序在dos中执行情况.P86-87

    假设程序要被dos系统加载到sa:0000的内存中,在这个地址的内存开始会有256个字节的PSP程序,用于加载程序和dos系统的通信.ds中的地址为sa. 真正的程序会在这256个字节之后.所以真正程 ...

  5. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-1-单个host上的容器网络

    Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 1) 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -p或 -P参数 ...

  6. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-2-相应配置

    1) 快速配置指南(详细使用下面会讲) 其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效 下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动(dock ...

  7. android 常用小功能(第二版)

    经历过一段岁月,转眼2013的半年都过去了,第二版整理好的小功能,答应大家发布的,直到今日,终于和大家相见了,第二版没有第一版多,大家也可以去参考第一版的内容,希望大家使用愉快! 目录: 1.获取当前 ...

  8. 简单的web三层架构系统【第二版】

    昨天写了 web三层架构的第一版,准确的说是三层架构的前期,顶多算是个二层架构,要慢慢完善. 第一版里,程序虽说能运行起来,但是有一个缺陷,就是里面的SQL语句,是使用的拼接字符进行执行.这样安全系数 ...

  9. J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册)

    J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册) 之前那一版本(http://www.cnblogs.com/rojas/p/4794684.html)没考虑 DLL 注 ...

随机推荐

  1. 12月22日《奥威Power-BI财务报表数据填报》腾讯课堂开课啦

    一扇可以通向任何地方的“任意门”,是我们多少人幼时最梦寐以求的道具之一.即使到了现在,工作中的我们还会时不时有“世界那么大,我想去看看”的念头,或者在突然不想工作的时刻,幻想着自己的家门变成了“任意门 ...

  2. iOS XCode启用/关闭Clang Warnings

    前言:warnings是编码中很重要的一个环节,编译器给出合理的warning能帮助开发者找到自己代码的问题,防止很多bug产生.  默认用XCode创建一个工程,会自动开启一些重要的warnings ...

  3. Git的.gitignore文件配置

    .gitignore是Git工具的配置文件,用于屏蔽某些文件上传到线上. 创建.gitignore 在window系统中,不允许新建文件名以"."开头的文件,所以通过git bas ...

  4. Python学习笔记(基本功能的使用)

    整理了以前使用的几个笔记:上传到了github; python_notes 以后在慢慢更新吧:

  5. 【搬运】systemctl 命令完全指南

    Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器. Systemd是一个系统管理守护进程.工具和库的集合,用于取代System V初始进程.Systemd的功能是 ...

  6. Opennms 问题整理

    1.网页时间显示不正确,需要修改:bin/opennms: 添加:MANAGER_OPTIONS="$MANAGER_OPTIONS -Duser.timezone=Asia/Shangha ...

  7. hduoj 1251 统计难题

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory ...

  8. VS2015 VisualStudio Emulator for Android 模拟器目录

    C:\Users\wangbin5542\AppData\Local\Microsoft\VisualStudioEmulator\Android\Containers\Local\Devices 目 ...

  9. C#中常用的转义字符及@符号的一些作用

    转义符指的就是一个'\'+一个特殊的字符,组成了一个具有特殊意义的字符. \n:表示换行.  /b表示一个退格键.放到字符串两边没有效果. \t:表示tab键的空格 \":表示一个英文半角的 ...

  10. JS弹出浮层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...