历史上的今天
今天是:2024年09月20日(星期五)
2018年09月20日 | STM32 24C02函数 I2C例程 非STM32库方式
2018-09-20 来源:eefocus
#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
/* Send I2C1 data */
//I2C_SendData(I2C1, pDat[i]);
STM32_I2c1_Regs->dr.bit.DR=pDat[i];
/* 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
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[i] = I2C_ReceiveData(I2C1);
pDat[i] = STM32_I2c1_Regs->dr.bit.DR;
}
}//end sub
史海拾趣
|
在网上看到许多有关MCU的问题和评论 也许其中有很多是枪手写的 其实我没有真正的用过任何的MCU 说以有错的地方请高手指正 STC 最国产 频率打五折用 AVR 最老龄死 就他没样片 超级孤寒 PIC 卖广告最多 超常在教材上花心思 MSP430功耗最大 说 ...… 查看全部问答> |
|
BridgeWave Communications是能够提供完整的点到点毫米波链路解决方案的公司之一,公司在全球部署有数千台60和80GHz的无线千兆比特设备。该公司的毫米波无线设备支持局域网(LAN)干线扩展、移动电话回传应用以及大容量互联网接入。他们提供的无线系 ...… 查看全部问答> |
|
我编写了一个基于Windows ce的应用程序,其中要求能支持打印。要想实现,需要做哪些工作?请指教。 开发板使用的是ICOP的VDX6354,是支持打印的。 但是我将打印机插上(通过usb,并且是hp打印机)以后,系统没有自动显示新添加的打印机。 这是什 ...… 查看全部问答> |
|
我们在为客户开发一款机器,使用pxa270的cpu,客户要求可以在线播放youtube视频。 使用IE上Youtube的网站,总是自动转到youtube的mobile版,视频是3gp格式的,点击播放自动弹出mediaplay,但是提示连接不上服务器。如果上youtube的桌面版,则提示f ...… 查看全部问答> |
|
各位,我现在想实现这样的功能: 1、从数据库中获取电话号码后(如:12345),通过拨号按钮直接拨到此电话上(12345)。 2、拨通后,接受的电话(12345)可以听到一段录音,然后按提示选择对应的功能健。比如按1同意,按2不同意,按3转人工。 3 ...… 查看全部问答> |
|
我想用flash magic下载提供的例程hex文件到板子中。我有个串口线&USB通讯电源线。串口线连接到COM1,然后将P0.14所在的JP2短接,电源部分JP7短接。不知为什么始终连接不成功。期间看到板子介绍说,可以全自动ISP下载,于是将JP2,JP1,JP3都短接(R ...… 查看全部问答> |




