哪位大神能帮忙分析93lc46b的读写程序为何读出数据与写的不一致
程序如下:
#include"93lc46b.h"
#define CS RA2
#define SK RA1
#define DI RA0
#define DO RA0
/*******************************************************************************
* 函 数 名 : Ewen()
* 函数功能 : 使能
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Ewen(void) {
unsigned char temp,InData;
ADCON1 = 0x7; //初始化为数字io。ra0到ra5。
TRISA =0x00;
CS=0;
SK=0;
CS=1;
InData=0x98; // 10011XXXX
for(temp=9;temp!=0;temp--) { // 9
DI=InData&0x80;
SK=1; SK=0;
InData<<=1;
}
CS=0;
}
/*******************************************************************************
* 函 数 名 : Ewds()
* 函数功能 : 非使能
* 输 入 : 无
* 输 出 : 无
* 备 注 : 起始之后I2C_SDA和I2C_SCL都为0
*******************************************************************************/
void Ewds(void) {
unsigned char temp,InData;
ADCON1 = 0x7; //初始化为数字io。ra0到ra5。
TRISA =0x00;
CS=0;
SK=0;
CS=1;
InData=0x00; // 10000XXXX
for(temp=9;temp!=0;temp--) { // 9
DI=InData&0x80;
SK=1; SK=0;
InData<<=1;
}
CS=0;
}
/*******************************************************************************
* 函 数 名 : Read(unsigned char address)
* 函数功能 :读
* 输 入 : 无
* 输 出 : 无
* 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲
*******************************************************************************/
unsigned int Read(unsigned char address) {
unsigned char temp;
unsigned int result;
Ewen();
ADCON1 = 0x7; //初始化为数字io。ra0到ra5。
TRISA =0x00;
SK=0; DI=1; // 110 A5-A0
CS=0; CS=1;
SK=1; SK=0; // 1
address=address&0x3f|0x80;
for(temp=8;temp!=0;temp--) { // 8
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
DO=1;
ADCON1 = 0x7; //初始化为数字io。ra0到ra5。
TRISA =0x01;
for(temp=16;temp!=0;temp--) { // 16
SK=1;
result=(result<<1)|DO;
SK=0;
}
CS=0;
Ewds();
return(result);
}
/*******************************************************************************
* 函 数 名 : Write(unsigned char address,unsigned int InData)
* 函数功能 : 写
* *
* 输 入 :
* 输 出 :
* 备 注 :
*******************************************************************************/
void Write(unsigned char address,unsigned int InData) {
unsigned char temp;
Ewen();
ADCON1 = 0x7; //初始化为数字io。ra0到ra5。
TRISA =0x00;
SK=0; DI=1; // 101 A5-A0
CS=0; CS=1;
SK=1; SK=0; // 1
address=address&0x3f|0x40;
for(temp=8;temp!=0;temp--) { // 8
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
for(temp=16;temp!=0;temp--) { // 16
DI=InData&0x8000;
SK=1; SK=0;
InData<<=1;
}
CS=0; DO=1;
CS=1; SK=1;
while(DO==0) { // busy test
SK=0; SK=1;
}
SK=0; CS=0;
Ewds();
}
此帖出自
小平头技术问答
若是高电平,则为16位数据模式;低电平,则为8位数据模式。
②给一个我在这次瑞萨大赛上设计的93C46的程序例子(8位数据模式,测试通过)
以及93C46的资料:
一周热门 更多>