导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[讨论]关于x5045读取一个字(16bit)可以吗?[sanmaoljh]

 *第21479篇: [讨论]关于x5045读取一个字(16bit)可以吗?

  
楼 主:sanmaoljh 2008年12月13日15:14
 [讨论]关于x5045读取一个字(16bit)可以吗?
#include   <reg52.h>  
#include   <stdio.h>  
#include"x5045.h"


//下面是我正在用的没有问题。
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中? 


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:嵌入式FAT16文件系统源码下载

[下一篇主题]:专业IC猎头招聘人才