打印
[电路设计]

有木有人 改写过官方的I2C库函数~

[复制链接]
2277|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kyzb001|  楼主 | 2011-12-6 11:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
官方的I2C库函数 好蛋疼啊!
有没有那位牛人改过.......
 

void DrcI2C_WriteByte(uint32_t address,uint8_t data )
{
uint32_t i;
SystemCoreClock = DrvSYS_GetHCLKFreq();
  //Open I2C1 and set clock = 50Kbps
if(DrvI2C_Open(I2C_PORT1, 50000))
  printf("Open i2c1 fail.\n");

    //send i2c start
DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0); //set start
while (I2C1->I2CON.SI == 0);   //poll si flag
//send writer command
I2C1->I2CDAT = 0x78;     //send writer command
    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, ); //clr si flag
    while( I2C1->I2CON.SI == 0 );      //poll si flag
// //send address high
// I2C1->I2CDAT = (address>>8)&0XFF;
// DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack
// while( I2C1->I2CON.SI == 0 );   //poll si flag
// //send address low
// I2C1->I2CDAT = address&0XFF;
// DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack
// while( I2C1->I2CON.SI == 0 );   //poll si flag
//send data
I2C1->I2CDAT = data;     //write data to
DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack
while( I2C1->I2CON.SI == 0 );   //poll si flag
    //send i2c stop
DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //send stop
while( I2C1->I2CON.STO);
//while( I2C1->CON.SI == 0 );
for(i=0;i<60;i++);
DrvI2C_Close(I2C_PORT1);
   
for(i=0;i<6000;i++);
for(i=0;i<6000;i++);
}
uint8_t DrcI2C_ReadByte(uint32_t address)
{
uint8_t TEMP;
  //Open I2C1 and set clock = 50Kbps
SystemCoreClock = DrvSYS_GetHCLKFreq();
DrvI2C_Open(I2C_PORT1, 50000);
//send i2c start
    DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);   //set start
while (I2C1->I2CON.SI == 0);    //poll si flag
  
    //send writer command
I2C1->I2CDAT = 0XA0;
    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si
    while( I2C1->I2CON.SI == 0 );      //poll si flag

//send address high
    I2C1->I2CDAT = (address>>8)&0XFF;
DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si and set ack
while( I2C1->I2CON.SI == 0 );      //poll si flag
   
//send address low
I2C1->I2CDAT = address&0XFF;
DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si and set ack
while( I2C1->I2CON.SI == 0 );      //poll si flag

//send start flag
DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);    //clr si and send start
while( I2C1->I2CON.SI == 0 );      //poll si flag

//send read command
I2C1->I2CDAT = 0XA1;
DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si
    while( I2C1->I2CON.SI == 0 );      //poll si flag
//resive data
I2C1->I2CDAT = 0XFF;
DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si
while( I2C1->I2CON.SI == 0 );      //poll si flag
TEMP= I2C1->I2CDAT;
//send i2c stop
  DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0);    //clr si and set stop
while( I2C1->I2CON.STO);
DrvI2C_Close(I2C_PORT1);
return TEMP;
}

这.......看着就蛋疼

比较一下STM32的



[code]uint8_t I2C_7588lcd_Write(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)
{
unsigned int i;
uint32_t u32delayno;

I2C_GenerateSTART(I2C_MASTER, ENABLE); //启动I2C

u32delayno=0;
while(!I2C_CheckEvent(I2C_MASTER, I2C_EVENT_MASTER_MODE_SELECT)); //等待响应,超时退出,放置死循
//发送器件地址
I2C_Send7bitAddress(I2C_MASTER, 0x78, I2C_Direction_Transmitter);

u32delayno=0;
while(!I2C_CheckEvent(I2C_MASTER, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) //等待器件响应
{
u32delayno++;
if ( u32delayno >= I2C_TIME_OUT )
{
USART1_Puts("error:send address\n");
return ERROR;
}
}
while(NumByteToWrite--)
{ //写数据

I2C_SendData(I2C_MASTER, *pBuffer);
//发送数据
pBuffer++;

for(i=50;i>0;i--) //等待器件响应 LCD答应ACK有点BUG所以这里采用延时
{
__nop();
}

}
I2C_GenerateSTOP(I2C_MASTER, ENABLE);
//停止I2C
return SUCCESS;

}
[/code]

相关帖子

沙发
kyzb001|  楼主 | 2011-12-6 11:34 | 只看该作者
特别是这个函数写的......要多晕就有多晕
DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);

有木有人改写过.....

使用特权

评论回复
板凳
Ryanhsiung| | 2011-12-6 11:41 | 只看该作者
我没有改写,但是我将DrvI2C_Ctrl 都封装起来了

https://bbs.21ic.com/icview-292158-1-1.html

使用特权

评论回复
地板
kyzb001|  楼主 | 2011-12-6 12:21 | 只看该作者
nuc这个 芯片 用的真是无比的蛋疼啊!!!!

使用特权

评论回复
5
Ryanhsiung| | 2011-12-6 12:48 | 只看该作者
nuc这个 芯片 用的真是无比的蛋疼啊!!!!
kyzb001 发表于 2011-12-6 12:21

还好,只是文档做的很不好而以!

使用特权

评论回复
6
kyzb001|  楼主 | 2011-12-6 14:29 | 只看该作者
还好,只是文档做的很不好而以!
Ryanhsiung 发表于 2011-12-6 12:48


就指的是文档...要大叔不弄那个群。 文档要更加蛋疼!

使用特权

评论回复
7
hotpower| | 2011-12-7 08:47 | 只看该作者
这个例程可以说是最臭的,因为它没表达iic的真缔。误导。

使用特权

评论回复
8
Ryanhsiung| | 2011-12-7 09:14 | 只看该作者
就指的是文档...要大叔不弄那个群。 文档要更加蛋疼!
kyzb001 发表于 2011-12-6 14:29


I2C status 寄存器就没有列出意义

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

粉丝