广告

原创 Mega16+CH375硬件测试程序

2009-5-20 20:45 3442 0 分类: MCU/ 嵌入式

前几天在做usbd12调试时不小心把12V电压接到5V上去了,烧了几个片子,D12也挂了,由天手头上没有D12了,再说手工焊接也挺麻烦的,上次买D12时顺便带了CH375。因为这一直都是用的AVR的片子,今天就把Mega16+CH375的硬件电路搭起来了,为了先测试硬件连接是否正常,就把OURAVR网站论坛上的那个测试程序用来检测,可是不行。南京沁恒网站也有同样贴子。稍微研究了一下,就试了如下程序,经验证通过:


/******************************
CH375测试程序
Mega16 模拟总线


控制端口定义:
        A0 -- PD3
        RD -- PD4
        WR -- PD5
        CS -- PD6
                                        
数据端口定义:
        PORTA
******************************/
#include <avr/io.h>
#include <util/delay.h>


/*端口初始化*/
void CH375_PORT_INIT(void)  /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
{
 DDRA = 0x00;  /* 设置8位并口为输入 */
 PORTD = 0xFD;//PORTB = 0x07;  /* 设置CS,WR,RD默认为高电平 */
 DDRD = 0x7A;//DDRB = 0x0F;  /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */
}

/* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
void CH375_WR_CMD_PORT( unsigned char cmd )
{
    PORTD |= 0x08;
 PORTD |= 0x08;
    PORTD |= 0x08;  /* 输出A0=1 */
 PORTA = cmd;  /* 向CH375的并口输出数据 */
 DDRA = 0xFF;  /* 并口D0-D7输出 */
 PORTD &= 0x9F;  /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS="0"; WR="0"; RD="1"; */
 DDRA = 0xFF;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
 DDRA = 0xFF;
 PORTD |= 0x70;  /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS="1"; WR="1"; RD="1"; */
 DDRA = 0x00;  /* 禁止数据输出 */
 PORTD &= 0xF7;  /* 输出A0=0; 可选操作 */
 PORTD &= 0xF7;
 PORTD &= 0xF7;
}


/* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */
void CH375_WR_DAT_PORT( unsigned char dat )
{
    PORTA = dat;
 PORTA = dat;
    PORTA = dat;  /* 向CH375的并口输出数据 */
 DDRA = 0xFF;  /* 并口D0-D7输出 */
 PORTD &= 0x97;  /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS="0"; WR="0"; RD="1"; */
 DDRA = 0xFF;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
 PORTD |= 0x70;  /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS="1"; WR="1"; RD="1"; */
 DDRA = 0x00;  /* 禁止数据输出 */
 DDRA = 0x00;
 DDRA = 0x00;
}


/* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
unsigned char CH375_RD_DAT_PORT(void)
{
    unsigned char mData;
/* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR;  通过并口直接读写CH375而非普通I/O模拟 */
 PORTA=0xff;  /* 至少延时1.2uS */
 PORTA=0xff;
 PORTA=0xff;
 DDRA = 0x00;  /* 数据输入 */
 PORTD &= 0xA7;  /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS="0"; WR="1"; RD="0"; */
 DDRA = 0x00;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
 DDRA = 0x00;
 mData = PINA;  /* 从CH375的并口PA输入数据 */
 PORTD |= 0x70;  /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS="1"; WR="1"; RD="1"; */
 return( mData );
}


/*******************************************
主函数
********************************************/        
int main(void)
{
        unsigned char testret,i=0;
        DDRB = 0xFF;
        PORTB = 0xFF;
        CH375_PORT_INIT();        //模拟总线,所以需要初始化端口方向


  while(1)
            {
             i++;
    CH375_WR_CMD_PORT(0x06);            //向CH375写命令(测试0x06)
             CH375_WR_DAT_PORT(i);               //向CH375写数据
             testret = CH375_RD_DAT_PORT();      //测试通过后变量testret里应该返回写的数据的取反
             PORTB = testret;                       //从PORTB端口接发光二极管可看到数据变化
             _delay_ms(250);
    }
        return 0;
}


编译器:winavr


晶振:7.3728M


31295a2b-2ffb-4cec-af57-dba492ea5463.JPG

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
haoran_flying 2009-05-16 20:59
我做的OO的usb鼠标
  五一放假在家没事,逛到了END圈圈的USB专区,小组公告的那段话很实在。原来做的项目都是通过串口通讯,看来有时间还是要学习一下USB。  这段时间看了一下协议和其他的一些资料,还只是一个模糊的认识...
haoran_flying 2009-05-15 16:58
USB协议深入分析_字符串描述符(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/25/1584778.aspx上一次说到把配置描述符返回给主控器那里了,现在接着下来,就会收到主控器...
haoran_flying 2009-05-15 16:56
USB协议深入分析_配置(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/23/1575676.aspx前面已经介绍设置USB的设备地址,接着下来是做什么呢?其实有了设备地址...
haoran_flying 2009-05-15 16:55
USB协议深入分析_设置USB地址(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/18/1568991.aspx前面已经解释主控器怎么样发送设备描述符下来,然后设备返回相应的设备描述...
haoran_flying 2009-05-15 16:53
USB协议深入分析_返回设备描述符(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/12/1561959.aspx 回应设备描述符上一次已经介绍怎么样收到主控器的获取设备描述符的数据,...
我要评论
0
0
广告