|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2008-7-31 16:49:21
|
显示全部楼层
真的很奇怪啊 我的CS接在PC7,复位接在PC6, AD0~AD7接在PA口。ALE、WR、RD分别接在PD7~PD5,PC0~PC5接LED,可是怎么也不对
#include "iom16v.h"
#include "stdio.h"
#include "macros.h"
#define uint unsigned int
#define uchar unsigned char
#define REG_CONTROL 0x00
#define REG_COMMAND 0x01
#define REG_STATUS 0x02
#define REG_IR 0x03
#define REG_ACR 0x04
#define REG_AMR 0x05
#define REG_BTR0 0x06
#define REG_BTR1 0x07
#define REG_OCR 0x08
#define REG_TxBuffer1 0x0A
#define REG_TxBuffer2 0x0B
#define REG_TxBuffer3 0x0C
#define REG_TxBuffer4 0x0D
#define REG_TxBuffer5 0x0E
#define REG_TxBuffer6 0x0F
#define REG_TxBuffer7 0x10
#define REG_TxBuffer8 0x11
#define REG_TxBuffer9 0x12
#define REG_TxBuffer10 0x13
#define REG_RxBuffer1 0x14
#define REG_RxBuffer2 0x15
#define REG_RxBuffer3 0x16
#define REG_RxBuffer4 0x17
#define REG_RxBuffer5 0x18
#define REG_RxBuffer6 0x19
#define REG_RxBuffer7 0x1A
#define REG_RxBuffer8 0x1B
#define REG_RxBuffer9 0x1C
#define REG_RxBuffer10 0x1D
#define REG_CDR 0x1F
uchar RcvBuf[20];
uchar SendBuf[20];
uchar kaiguaninfo[8]={0x55,0x00,0x55,0x00,0x55,0x00,0x55,0x00};
void delay(int j)
{
unsigned int i;
while(j>0)
{
for(i=1000;i>0;i--)
{}
j--;
}
}
void port_init(void)
{
DDRB=0x00;
PORTB=0x00;
DDRC=0xFF;
PORTC=0x7f;
DDRD=0xf0;
PORTD=0xff;
}
void init_MCU(void)
{
UBRRH=0;
UBRRL=47;//设置波特率9600 7.783M晶振
UCSRB=0xd8;
UCSRC=0x86;
MCUCR|= 0x0c;//INT0使能,低电平触发中断
//INT1使能,上升沿触发中断
MCUCSR|= 0x00;
GICR=0xc0;//开启外部中断0和1
//SEI();
}
//以address为地址,从sja1000中读取一个字节
uchar read(uchar address)
{
uchar mid,i;
PORTC&=~BIT(7); //片选信号有效
PORTD|=BIT(7); //置ALE为1
DDRA=0xff; //设置A口为输出
PORTA=address; //A口输出地址
PORTD&=~BIT(7); //置ALE为0
DDRA=0x00; //设置A口为输入
PORTD&=~BIT(5); //读信号有效
PORTD|=BIT(5); //读信号置1
PORTC|=BIT(7); //片选信号置1
return mid;
}
//以address为地址,向sja1000中写一个字节
void write(uchar address,uchar x)
{
uchar i;
PORTC&=~BIT(7); //片选信号有效
PORTD|=BIT(7); //置ALE为1
DDRA=0xff; //设置A口为输出
PORTA=address; //A口输出地址
PORTD&=~BIT(7); //置ALE为0
PORTD&=~BIT(6); //写信号有效
PORTA=x; //A口输出数据
PORTD|=BIT(6); //写信号置1
PORTC|=BIT(7); //片选信号置1
}
void CAN_RESET(void)
{
PORTC&=~BIT(6);
delay(10);
PORTC|=BIT(6);
CLI();
while((read(REG_CONTROL)&0x01))
PORTC&=~0x01;(LED)
write(REG_CONTROL,0x01);
write(REG_CDR,0x48);
write(REG_ACR,0x01);
write(REG_AMR,0x00);
write(REG_OCR,0xaa);
write(REG_BTR0,0x01);
write(REG_BTR1,0x1c);
write(REG_CONTROL,0x1E);
while(((read(REG_CONTROL))&0x01)==1)
{
write(REG_CONTROL,0x1E);
PORTC&=~0x02;//(LED)
}
SEI();
}
//读取can寄存器数据
uchar CAN_ReadRegister(uchar RegIndex)
{
return(read(RegIndex));
}
void SendData(void)
{
uchar datalong;
uint i;
if((CAN_ReadRegister(REG_CONTROL)&0x01)==0)
{
SendBuf[0] = 0x11;
SendBuf[1] = 0x28;
for (i=0; i<8; i++)
SendBuf[i+2]=kaiguaninfo;
if((CAN_ReadRegister(REG_STATUS)&0x10)!=0)
{
if((CAN_ReadRegister(REG_STATUS)&0x08)==0x08)
{
if((CAN_ReadRegister(REG_STATUS)&0x04)==0x04)
{
write(REG_TxBuffer1,SendBuf[0]);
write(REG_TxBuffer2,SendBuf[1]);
write(REG_TxBuffer3,SendBuf[2]);
write(REG_TxBuffer4,SendBuf[3]);
write(REG_TxBuffer5,SendBuf[4]);
write(REG_TxBuffer6,SendBuf[5]);
write(REG_TxBuffer7,SendBuf[6]);
write(REG_TxBuffer8,SendBuf[7]);
write(REG_TxBuffer9,SendBuf[8]);
write(REG_TxBuffer10,SendBuf[9]);
}
write(REG_COMMAND,0x01);
PORTC&=~0x04; //(LED)
}
}
}
else
{
printf("SJA1000 is working as Reset Mode!\n");
CAN_RESET();
}
}
可是怎么也不对啊,sja1000的初始化里面寄存器写值就不对,帮我看下是怎么回事,谢谢! |
|