前几天在做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
文章评论(0条评论)
登录后参与讨论