原创 STM32 24C02函数 I2C例程 非STM32库方式

2008-8-31 11:51 8284 10 11 分类: MCU/ 嵌入式

//=============================================================================
//
//=============================================================================


#define ADDR_24CXX        0xA0
void I2C_24CXX_Write(u16 nAddr, u8* pDat, u16 nLen)
{
   u16 i = 0;
 /* Enable I2C1 acknowledgement if it is already disabled by other function */
 //I2C_AcknowledgeConfig(I2C1, ENABLE);
 STM32_I2c1_Regs->cr1.bit.ACK=1;   //   ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
 
 /* Send I2C1 START condition */
 //I2C_GenerateSTART(I2C1, ENABLE);
 STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
   
  /* Test on I2C1 EV5 and clear it */
 // 【SB=1 起始条件已发送 读SR1,然后写数据DR 清零 】   MSL="1主模式"   BUSY="1" 在总线上正在进行数据通讯 )
 //  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){;}  /* EV5 */
 while(!(STM32_I2c1_Regs->sr1.bit.SB & I2C_SB)) ;


   /* Send slave address for write */
 //I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Transmitter);
 STM32_I2c1_Regs->dr.bit.DR=ADDR_24CXX;
   
 /* Test on I2C1 EV6 and clear it */
 // 【ADDR=1  地址发送结束;读SR1和SR2来清零 】。  TXE="1" 数据寄存器空 MSL="1" BUSY="1", TRA="1" 数据已发送
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){;} /* EV6 */
 while(!(STM32_I2c1_Regs->sr1.all & I2C_ADDR)) ;
 STM32_I2c1_Regs->sr2.all;


   /* Send the low part of memory address */
   //I2C_SendData(I2C1, (u8)nAddr);
 STM32_I2c1_Regs->dr.bit.DR=(u8)nAddr;


 /* Test on I2C1 EV8 and clear it */
 // 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】  BTF="1:" 字节发送结束 TRA="数据已发送"  BUSY="在总线上正在进行数据通讯"  MSL="主模式"
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){} /* EV8 */
        while(!(STM32_I2c1_Regs->sr1.all & I2C_TXE));
 
   for(i=0;i<nLen;i++)
 {
    /* Send I2C1 data */
    //I2C_SendData(I2C1, pDat);
    STM32_I2c1_Regs->dr.bit.DR=pDat;


    /* Test on I2C1 EV8 and clear it */
    // 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】  BTF="1:" 字节发送结束 TRA="数据已发送"  BUSY="在总线上正在进行数据通讯"  MSL="主模式"
    //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){;} /* EV8 */
    while(!(STM32_I2c1_Regs->sr1.all & I2C_TXE));
 
  }
   /* Send I2C1 STOP Condition */
   //I2C_GenerateSTOP(I2C1, ENABLE);
   STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_STOP;
   while(STM32_I2c1_Regs->sr2.bit.MSL);  //  0:从模式


}//end sub


//=============================================================================
//
//=============================================================================
void I2C_24CXX_Read(u16 nAddr, u8* pDat, u16 nLen)
{
 u16 i = 0;
 /* Enable I2C1 acknowledgement if it is already disabled by other function */
 //I2C_AcknowledgeConfig(I2C1, ENABLE);
        STM32_I2c1_Regs->cr1.bit.ACK=1;   //   ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
 
 /* Send I2C1 START condition */
 //I2C_GenerateSTART(I2C1, ENABLE);
        STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
 
 /* Test on I2C1 EV5 and clear it */
 // 【SB=1 起始条件已发送 读SR1,然后写数据DR 清零 】   MSL="1主模式"   BUSY="1" 在总线上正在进行数据通讯 )
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){;}  /* EV5 */
 while(!(STM32_I2c1_Regs->sr1.bit.SB & I2C_SB)) ;
 
 /* Send 24CXX slave address for write */
 //I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Transmitter);
 STM32_I2c1_Regs->dr.bit.DR=ADDR_24CXX;


 /* Test on I2C1 EV6 and clear it */
 // 【ADDR=1  地址发送结束;读SR1和SR2来清零 】。  TXE="1" 数据寄存器空 MSL="1" BUSY="1", TRA="1" 数据已发送
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){;} /* EV6 */
 while(!(STM32_I2c1_Regs->sr1.all & I2C_ADDR)) ;
 STM32_I2c1_Regs->sr2.all;
 
 /* Send the low part of memory address */
 //I2C_SendData(I2C1, (u8)nAddr);
 STM32_I2c1_Regs->dr.bit.DR=(u8)nAddr;


 /* Test on I2C1 EV8 and clear it */
 // 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】  BTF="1:" 字节发送结束 TRA="数据已发送"  BUSY="在总线上正在进行数据通讯"  MSL="主模式"
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){} /* EV8 */
 while(!(STM32_I2c1_Regs->sr1.all & I2C_TXE));
 
 //====================================================================
 //I2C_GenerateSTART(I2C1, ENABLE);
        STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
 
 /* Test on EV5 and clear it */
 // 【SB=1 起始条件已发送 读SR1,然后写数据DR 清零 】   MSL="1主模式"   BUSY="1" 在总线上正在进行数据通讯 )
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){;}  /* EV5 */
 
 while(!(STM32_I2c1_Regs->sr1.bit.SB & I2C_SB)) ;
 
 /* Send 24CXX slave address for read */
 //I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Receiver);
  STM32_I2c1_Regs->dr.bit.DR=(u8)ADDR_24CXX|((u8)0x01);


 /* Test on EV6 and clear it */
 // 【ADDR=1  地址发送结束;读SR1和SR2来清零 】。  TXE="1" 数据寄存器空 MSL="1" BUSY="1", TRA="1" 数据已发送
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){;}  /* EV6 */
 
 while(!(STM32_I2c1_Regs->sr1.all & I2C_ADDR)) ;
 STM32_I2c1_Regs->sr2.all;
 
 for(i=0;i<nLen;i++)
 {
   if((i+1)>=nLen)
   {
     /* Disable I2C1 acknowledgement */
     //I2C_AcknowledgeConfig(I2C1, DISABLE);
     STM32_I2c1_Regs->cr1.bit.ACK=0;       //   ACK:应答使能   关闭
 
     /* Send I2C1 STOP Condition */
     //I2C_GenerateSTOP(I2C1, ENABLE);
     STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_STOP;
     while(STM32_I2c1_Regs->sr2.bit.MSL);  //  0:从模式 
 
   }
   /* Test on EV7 and clear it */
   // 【RXNE=1  数据寄存器非空; 读写DR清零 】 BUSY="1" 在总线上正在进行数据通讯 MSL="1" 主模式
   //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)){;}  /* EV7 */
     while(!(STM32_I2c1_Regs->sr1.all & I2C_RXNE)) ;
 
   /* Store I2C1 received data */
   //pDat = I2C_ReceiveData(I2C1);
   pDat = STM32_I2c1_Regs->dr.bit.DR;
 }


}//end sub

文章评论1条评论)

登录后参与讨论

用户461316 2008-9-1 23:13

收藏你的I2C例程
相关推荐阅读
用户479664 2009-12-30 17:07
CRC校验之 MSP430与STM32通吃版
CRC是一个必备工具。在工程上,特别是通信。好比网卡芯片,无效RF CC500 CC1100等芯片内部都有CRC电路。...
用户479664 2009-09-01 17:59
TMS320F280X SPI SPIA使用入门与总结
TMS320F280X SPI SPIA使用入门与总结Netjob @ 2009年 8月31日晚我使用过NXP ARM LPC2138的SPI口,ATMEL AT91SAM7S256的SPI,MSP4...
用户479664 2009-08-25 23:09
STM32 CAN 标称位时间计算
以知 CAN总线 每秒发送的位数,即 最大传输 比特率是 1Mb/s( 1 兆位每秒)这样 CAN总线的【最小标称位时间】就是  1 μs,简单的说就是 发送 1 位要1 μs时间。根据ISO1189...
用户479664 2009-08-25 23:07
精解 SPI 的 CPHA 时钟相位 与CPLK 时钟极性
精解 SPI 的 CPHA 时钟相位 与CPLK 时钟极性Netjob @ 2009-08-01...
用户479664 2009-06-18 23:00
STM32 Hello World!
https://static.assets-stash.eet-china.com/album/old-resources/2008/12/12/8ee2aa15-a51b-441d-96f5-a15...
用户479664 2009-05-11 23:56
精解 Solder Mask 和Paste Mask 区别
Solder Mask Layers【阻焊层】。这个是反显层! 有的表示无的,无的表示有的嘛,不明白?你在Solder Mask Layer【有TopSolder 和BottomSolder】上FIL...
我要评论
1
10
关闭 站长推荐上一条 /2 下一条