|
楼主 |
发表于 2010-10-18 08:45:55
|
显示全部楼层
没有考马老师的意识,您别误会,昨天在家,没有测试的代码,官方提供的都是nuc100的代码,和m051没什么区别,下面是从官方修改过来用于m051的代码
/*i2c写数据*/
void write_i2c_byte(uint8_t *byte,uint32_t address,uint8_t count)
{
uint8_t n;
uint16_t i;
//send i2c start
DrvI2C_Ctrl(1, 0, 1, 0); //set start 发送启动位
while (I2C->CON.SI == 0); //poll si flag
//send writer command
I2C->DATA = 0XA0; //send writer command 发送写命令
DrvI2C_Ctrl(0, 0, 1, 0); //clr si flag
while( I2C->CON.SI == 0 ); //poll si flag
//send address high
//I2C->DATA = (address>>8)&0XFF;
//DrvI2C_Ctrl(0, 0, 1, 1); //clr si and set ack
//while( I2C->CON.SI == 0 ); //poll si flag
//send address low
I2C->DATA = address&0XFF; //发送数据地址
DrvI2C_Ctrl(0, 0, 1, 1); //clr si and set ack
while( I2C->CON.SI == 0 ); //poll si flag
for(n=0;n<count;n++){
//send data
I2C->DATA = *(byte+n); //write data to 发送数据
DrvI2C_Ctrl(0, 0, 1, 1); //clr si and set ack
while( I2C->CON.SI == 0 ); //poll si flag
}
//send i2c stop
DrvI2C_Ctrl(0, 1, 1, 0); //send stop 发送停止位
//while( I2C0->CON.SI == 0 );
for(i=0;i<60;i++); //延时
//DrvI2C_Close(I2C_PORT0); //关闭I2C
for(i=0;i<6000;i++);
for(i=0;i<6000;i++);
}
/*i2c读数据*/
void read_i2c_byte(uint8_t *byte,uint32_t address,uint8_t count)
{
uint8_t n;
uint16_t i;
for(n=0;n<count;n++){
//send i2c start
DrvI2C_Ctrl(1, 0, 1, 0); //set start 发送启动位
while (I2C->CON.SI == 0); //poll si flag
//send writer command
I2C->DATA = 0XA0; //发送写命令
DrvI2C_Ctrl(0, 0, 1, 0); //clr si
while( I2C->CON.SI == 0 ); //poll si flag
//send address high
//I2C->DATA = (address>>8)&0XFF;
//DrvI2C_Ctrl(0, 0, 1, 1); //clr si and set ack
//while( I2C->CON.SI == 0 ); //poll si flag
//send address low
I2C->DATA = (address+n)&0XFF; //发送地址
DrvI2C_Ctrl(0, 0, 1, 1); //clr si and set ack
while( I2C->CON.SI == 0 ); //poll si flag
//send start flag
DrvI2C_Ctrl(1, 0, 1, 0); //clr si and send start 发送启动位
while( I2C->CON.SI == 0 ); //poll si flag
//send read command
I2C->DATA = 0XA1; //发送读命令
DrvI2C_Ctrl(0, 0, 1, 0); //clr si
while( I2C->CON.SI == 0 ); //poll si flag
//resive data
I2C->DATA = 0XFF;
DrvI2C_Ctrl(0, 0, 1, 0); //clr si
while( I2C->CON.SI == 0 ); //poll si flag
*(byte+n)= I2C->DATA; //读取数据
//DrvI2C_Ctrl(0, 0, 1, 0); //clr si and set ack
//while( I2C->CON.SI == 0 ); //poll si flag
//send i2c stop
DrvI2C_Ctrl(0, 1, 1, 0); //clr si and set stop 发送停止位
//DrvI2C_Close(I2C_PORT0); //关闭I2C
}
} |
|