📄 复件 24c02.c
字号:
//#include "24C02.h"
/*
//==========================================
//IIC的起始位
void star24(void)
{
sda=1;scl=1;_nop_();
sda=0;_nop_();
scl=0;_nop_();
}
//==========================================
//IIC的结束位
void pause24(void)
{
sda=0;scl=0;_nop_();
scl=1;_nop_();
sda=1;_nop_();
}
//发送答应位
void ack24(void)
{
sda=0;scl=1;_nop_();
scl=0;sda=0;_nop_();
}
//发送非答应位
void uack24(void)
{
sda=1;scl=1;_nop_();
scl=0;sda=0;_nop_();
}
//答应位检测
cack24(void)
{
bit data flag;
sda=1;scl=1;_nop_();
flag=sda;
scl=0;
return(flag);
}
//==========================================
//读一个IIC内的字节
unsigned char rd24(void)
{
sda=1;scl=1;_nop_();a7=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();a6=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();a5=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();a4=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();a3=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();a2=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();a1=sda;scl=0;_nop_();
sda=1;scl=1;_nop_();a0=sda;scl=0;_nop_();
return(ACC);
}
//=============================================
//写一个IIC字节
void wd24(unsigned char dd)
{
ACC=dd;
sda=a7;scl=1;_nop_();scl=0;sda=0;_nop_();
sda=a6;scl=1;_nop_();scl=0;sda=0;_nop_();
sda=a5;scl=1;_nop_();scl=0;sda=0;_nop_();
sda=a4;scl=1;_nop_();scl=0;sda=0;_nop_();
sda=a3;scl=1;_nop_();scl=0;sda=0;_nop_();
sda=a2;scl=1;_nop_();scl=0;sda=0;_nop_();
sda=a1;scl=1;_nop_();scl=0;sda=0;_nop_();
sda=a0;scl=1;_nop_();scl=0;sda=0;_nop_();
}
//===============================================
//读出IIC内指定地址的值
unsigned char read_I2C(unsigned int address)
{
unsigned char dd;
//EA=0;
star24();wd24(0xa0);cack24();//等应答位
wd24(address);cack24(); //等应答位
star24();wd24(0xa1);cack24();//等应答位
dd=rd24();uack24();pause24();
return(dd);
// EA=1;
}
//======================================================
//在指定的IIC地址内写一个字节
void Write_I2C(unsigned int address,unsigned char dd)
{
//EA=0;
star24();wd24(0xa0);cack24();
wd24(address);cack24();
wd24(dd);cack24();pause24();
//EA=1;
}
unsigned char readBlock_I2C(unsigned int start_add,unsigned int length,unsigned char *buf_ptr)
{
int i;
for(i=0;i<length;i++)
{
buf_ptr[i]=read_I2C(start_add);
start_add++;
//buf_ptr++;
}
return(buf_ptr);
}
//void s240(void)
//{
// _nop_();scl0=0;sda0=1;scl0=1;_nop_();sda0=0;_nop_();scl0=0;
//}
//void p240(void) {
// sda0=0;scl0=1;_nop_();sda0=1;
//}
/* time=0; //time为定时器时间参考,time增加1代
//表1ms,如果没有用定时器,取消该行
while (1)
{
s24();
wd24(0xa0|ddd);
sda=1;
if (sda==0) break;
if (time>10) break; //此行防止由于eeprom器件损坏后的死循环
scl=0;
}*/
/*void writeI2C_NonDMA( BYTE *Bp_Buffer,BYTE B_Length, BYTE B_Stop )
{
int WaitTimeout = I2C_WAIT_TIMEOUT;
gm_WriteRegByte(I2C_MST_CTRL, I2C_EN );// Enable I2C master
// Write slave device address and operation bit.
gm_WriteRegByte( I2C_MST_TX_DATA, B_DevAddress | SLAVE_WRITE );
gm_WriteRegByte( I2C_MST_TX_CTRL, (I2C_WR | I2C_STA) );
// Wait for transmission to complete.
while( (gm_ReadRegByte( I2C_MST_STATUS) & TIP ) != 0)
{
if ( WaitTimeout-- == 0) return ERR_TMO;
}
// send data bytes to slave
while( B_Length )
{
gm_WriteRegByte( I2C_MST_TX_DATA, *Bp_Buffer );
gm_WriteRegByte( I2C_MST_TX_CTRL, I2C_WR );
// wait for last transmit to complete.
WaitTimeout = I2C_WAIT_TIMEOUT;
while( (gm_ReadRegByte( I2C_MST_STATUS) & TIP ) != 0)
{
if ( WaitTimeout-- == 0) return ERR_TMO;
}
Bp_Buffer++; // point to next byte location
B_Length--;
}
// Send stop signal if only requested for.
if ( B_Stop )
{
gm_WriteRegByte( I2C_MST_TX_CTRL, I2C_STO );
// wait for last Bus to idle.
WaitTimeout = I2C_WAIT_TIMEOUT;
while( (gm_ReadRegByte( I2C_MST_STATUS) & Busy ) != 0)
{
if ( WaitTimeout-- == 0) return ERR_TMO;
}
}
return OK;
}*/
void s24(void) {
_nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;
}
void s240(void) {
_nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;
}
void p24(void) {
sda=0;scl=1;_nop_();sda=1;
}
void p240(void) {
sda=0;scl=1;_nop_();sda=1;
}
unsigned char rd24(void) {
sda=1;
scl=1;a7=sda;scl=0;
scl=1;a6=sda;scl=0;
scl=1;a5=sda;scl=0;
scl=1;a4=sda;scl=0;
scl=1;a3=sda;scl=0;
scl=1;a2=sda;scl=0;
scl=1;a1=sda;scl=0;
scl=1;a0=sda;scl=0;
sda=1;scl=1;scl=0;
return(ACC);
}
void wd24(unsigned char dd) {
ACC=dd;
sda=a7;scl=1;scl=0;
sda=a6;scl=1;scl=0;
sda=a5;scl=1;scl=0;
sda=a4;scl=1;scl=0;
sda=a3;scl=1;scl=0;
sda=a2;scl=1;scl=0;
sda=a1;scl=1;scl=0;
sda=a0;scl=1;scl=0;
sda=1;scl=1;
}
unsigned char read_I2C(unsigned int address){
unsigned char dd;
dd=((address&0x7ff)/256)<<1;
s24();wd24(0xa0|dd);scl=0;wd24(address);scl=0;
s24();wd24(0xa1|dd);scl=0;dd=rd24();p24();return(dd);
}
void Write_I2C(unsigned int address,unsigned char dd){
unsigned char ddd;
unsigned char time;
ddd=((address&0x7ff)/256)<<1;
s24();wd24(0xa0|ddd);scl=0;wd24(address);scl=0;wd24(dd);scl=0;p24();
time=0; //time为定时器时间参考,time增加1代表1ms,如果没有用定时器,取消该行
while (1) {
s24();
wd24(0xa0|ddd);
sda=1;
if (sda==0) break;
if (time++>256) break; //此行防止由于eeprom器件损坏后的死循环
scl=0;
}
}
void SaveXYToNVRAM(void)
{
Write_I2C(9,Pref_x);
Write_I2C(10,Pref_y);
}
void ReadXYFromNVRAM(void)
{
Pref_x=read_I2C(9);
Pref_y=read_I2C(10);
}
void SaveGcodeToI2C(unsigned char start_add,unsigned char *p,unsigned char lenth)
{
int i;
for(i=0;i<lenth;i++)
{
write_I2C(start_add,*p);
start_add++;
p++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -