//下面是我正在用的没有问题。
sbit SO=P2^1;
sbit SI=P2^2;
sbit SCK=P2^3;
sbit CS=P2^0;
//25045可编程看门狗监控EEPROM指令集
#define WREN 0x06; 00000110 //设置写使能锁存器(允许写操作)
#define WRDI 0x04; 00000100 //复位写使能锁存器(禁止写操作)
#define RDSR 0x05; 00000101 //读状态寄存器
#define WRSR 0x01; 00000001 //写状态寄存器(块锁定)
#define READ 0x03; 00000011 //从开始于所选地址的存储器列阵中读出数据
#define WRTE 0x02; 00000010 //把数据写入开始于所选地址的存储器阵列中(1至4字
//定义两个数组
unsigned char rda[8];
unsigned char cs_rda[8];
//void in_byte(unsigned char byt);
//看门狗写使能子程序
void wren_dog(void)
{
// unsigned char com;
// com=0x06;//WREN;
SCK=0;
CS=0;
in_byte(0x06); //设置写使能锁存器(允许写操作)
SCK=0;
CS=1;
}
//看门狗写禁止子程序
void wrdi_dog(void)
{
//unsigned char com;
//com=0x04;//WRDI;
SCK=0;
CS=0;
in_byte(0x04); //复位写使能锁存器(禁止写操作)
SCK=0;
CS=1;
}
//写状态寄存器
void wrsr_dog(unsigned char status_reg)
{
// unsigned char com=0x01;//WRSR;
SCK=0;
CS=0;
in_byte(0x01); //写状态寄存器(块锁定)
in_byte(status_reg);
SCK=0;
CS=1;
wip_poll();
}
//读状态寄存器
unsigned char rdsr_dog(void)
{
// unsigned char com=0x05;//RDSR;
SCK=0;
CS=0;
in_byte(0x05);
return(out_byte()); //从5045中读出一个字节
SCK=0;
CS=1;
}
//字节读
/**********************************************************************************
函数名称:byte_read
参 数: L表示要读取数据的地址
返回值:data_dog
函数功能:
**********************************************************************************/
unsigned char byte_read(unsigned char L)
{
unsigned char data_dog,add;
SCK=0;
CS=0;
SO=1;
SI=1;
in_byte(0x03);
add=L;
in_byte(add);
data_dog=out_byte();
SCK=0;
CS=1;
return(data_dog);
}
//字节写
//L地址字节;D写入的数据
void byte_write(unsigned char L,unsigned char D)
{
unsigned char data_dog,add;
SCK=0;
CS=0;
SO=1;
SI=1;
in_byte(0x06); //写允许指令WREN
in_byte(0x02); //写存储器地址指令WRTE
add=L;
in_byte(add);
data_dog=D;
in_byte(data_dog);
CS=1;
wip_poll();
}
//复位看门狗子程序
void rest_dog(void)
{
CS=0;
CS=1;
}
//检验写操作是否结束
unsigned char wip_poll(void)
{
unsigned char i;
unsigned char wip;
for(i=0xff;i> =1;i--)
{
wip=rdsr_dog();
wip&=0x01;
if(wip==0) break;
}
return(wip);
}
/**********************************************************************************
函数名称: in_byte
参 数: byt
返回值: 无
功 能:当SCK上升沿时,单字节数据从SI数据线上输入5045
***********************************************************************************/
void in_byte(unsigned char byt)
{
unsigned char i;
//SCK=0;
//CS=0;
for(i=8;i> =1;i--)
{
SCK=0;
SI=byt&0x80;
SCK=1;
byt=byt < <1;
}
// SI=0;
// SCK=0;
// CS=1;
}
/*************************************************************************
函数名称:out_byte
参 数:无
返回值:无符号字符型byt
功 能:当SCK下降沿时,单片机从5045中读出一个字节
**************************************************************************/
unsigned char out_byte(void)
{
unsigned char i;
unsigned char byt;
//SO=1;
//SCK=0;
//CS=0;
for(i=8;i> =1;i--)
{
byt=byt < <1;
SCK=1;
SCK=0;
byt|=SO;
}
//SCK=0;
//CS=1;
return (byt);
}
上面这个x5045的程序包括读取寄存器函数,写寄存器函数,指定存储区地址读取一个字节,在指定存储区地址写入一个字节函数
问题一:我想从5045的芯片中每次读取一个字,也就是16bit,在datasheet中没有关于读取两个字节的说明,我能不能把每两次读取一个字节当作一个字呢?
问题二:我想做一个数组存储数据放到5045中,然后单片机运行时每次到5045中读取数据写入我要控制的芯片寄存器中,请问大概怎样写程序?
是不是在单片机初始化时,把在单片机中构造的数组数据一一写入5045中?