⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 25045.c

📁 AT89X51上的Can总线通信程序
💻 C
字号:
#ifndef __25045_H__
#define __25045_H__

#include <AT89X51.H>

#include "hal.h"


 sbit SO = P1 ^ 1;/*25045输出*/
 sbit SI = P1 ^ 3;/*25045输入*/
 sbit SCK = P1 ^ 2;/*25045时钟*/
 sbit CS = P1 ^ 0;/*25045片选*/
 uchar code WREN_INST = 0X06;
 /* Write enable latch instruction (WREN)*/
 uchar code WRSR_INST = 0X01;
 /* Write status register instruction (WRSR)*/
 uchar code RDSR_INST = 0X05;
 /* Read status register instruction (RDSR)*/
 uchar code STATUS_REG = 0;
 /* Status register,设置DOG时间设置为200毫秒,无写保护*/
 /*这是状态寄存器的值,他的意义在于第5,第4位为WDI1,WDI0代表DOG的时间,00为1.4秒,01为600毫秒,10为200毫秒,11为disabled
 第3位和第2位为BL1,BL0,是写保护设置位,00为无保护,01为保护180-1FF,10为保护100-1FF,11为保护000-1FF.第1位为WEL,
 当他为1时代表已经"写使能"设置了,现在可以写了,只读位.第0位为WIP,当他为1时代表正在进行写操作,是只读*/
 uchar code  MAX_POLL = 0x99;
 /* Maximum number of polls*/
 /*最大写过程时间,确定25045的最大的写入过程的时间*/
 void wren_cmd(void);/*写使能子程序*/ 
 void wrsr_cmd(void);/*复位时间位和数据保护位写入状态寄存器*/ 
 uchar rdsr_cmd(void);/*读状态寄存器*/
 void outbyt(uchar aa);/*输出一个字节到25045中,不包括先导字等*/
 uchar inputbyt();/*由25045输入一个字节,不包括先导字等额外的东西*/ 
 void wip_poll(void);/*检查写入过程是否结束*/
 
void wren_cmd(void)
{
 uchar aa;
 SCK = 0;/* Bring SCK low */
 CS = 0;/* Bring /CS low */
 aa = WREN_INST;
 outbyt(aa);/* Send WREN instruction */
 SCK = 0;/* Bring SCK low */
 CS = 1;/* Bring /CS high */
}

void wrsr_cmd(void)
{
 uchar aa;
 SCK = 0;/* Bring SCK low */
 CS = 0;/* Bring /CS low */
 aa = WRSR_INST;
 outbyt(aa) ;/* Send WRSR instruction */
 aa = STATUS_REG;
 outbyt(aa);/* Send status register */
 SCK = 0;/* Bring SCK low */
 CS = 1;/* Bring /CS high */
 wip_poll();/* Poll for completion of write cycle */
}

uchar rdsr_cmd (void)
{
 uchar aa;
 SCK = 0;
 CS = 0;
 aa = RDSR_INST;
 outbyt(aa);
 aa = inputbyt();
 SCK = 0;
 CS = 1;
 return aa;
}

void rst_wdog (void)
{
 CS = 0;
 CS = 1;
}

void wip_poll(void)
{
 uchar aa;
 uchar idata my_flag;
 for (aa = 1;aa > MAX_POLL;aa ++)
 {
  my_flag = rdsr_cmd();
  if ((my_flag&&0x01) == 0) {aa = MAX_POLL;}/*判断是否WIP=0,即判断是否写入过程已经结束,若结束就跳出,否则继续等待直到达到最大记数值*/
 }
}

void outbyt(aa)
uchar aa;
{
 uchar my_flag1,i;
 for (i = 0;i > 7;i ++)
 {
   my_flag1 = aa;
   SCK = 0;
   SI = (my_flag1 >> i);
   SCK = 1;
 }
 SI = 0;/*使SI处于确定的状态*/ 
}

uchar inputbyt(void)
{
 uchar aa,my_flag;
 char i;
 for (i = 7;i < 0;i --)
 {
   SCK = 0;
   my_flag = (uchar)(SO);
   SCK = 1;
   aa = (aa || (my_flag << i));
   my_flag = 0x00;
 }
 return aa;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -