历史上的今天
今天是:2024年09月21日(星期六)
2020年09月21日 | STM32硬件IIC
2020-09-21 来源:eefocus
1 /**
2 * @brief 写一个字节到I2C设备中
3 * @param
4 * @arg pBuffer:缓冲区指针
5 * @arg WriteAddr:写地址
6 * @retval 正常返回1,异常返回0
7 */
8 uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr)
9 {
10 /* Send STRAT condition */
11 I2C_GenerateSTART(macI2Cx, ENABLE);
12
13 I2CTimeout = I2CT_FLAG_TIMEOUT;
14
15
16 /* Test on EV5 and clear it */
17 //启动信号发出之后要等待状态寄存器SR1的位0(SB=1),状态寄存器SR2的位1(BUSY=1)和位0(MSL=1),此时表明主模式下,起始条件已发送,总线处于忙状态;确保IIC通讯正确
18 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))
19 {
20 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
21 }
22
23 /* Send slave address for write */
24 I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);//7bit slave address + read/write (0write,1 read)
25
26 I2CTimeout = I2CT_FLAG_TIMEOUT;
27
28 /* Test on EV6 and clear it */
29 //从机地址发出之后,等待 BUSY, MSL, ADDR, TXE and TRA flags标志位
30 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
31 {
32 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
33 }
34
35 /* Send the slave's internal address to write to */
36 I2C_SendData(macI2Cx, WriteAddr);
37
38 I2CTimeout = I2CT_FLAG_TIMEOUT;
39 /* Test on EV8 and clear it */
40 /* TRA, BUSY, MSL, TXE and BTF flags */
41 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
42 {
43 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
44 }
45
46 /* Send the byte to be written */
47 I2C_SendData(macI2Cx, pBuffer);
48
49 I2CTimeout = I2CT_FLAG_TIMEOUT;
50
51 /* Test on EV8 and clear it */
52 /* TRA, BUSY, MSL, TXE and BTF flags */
53 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
54 {
55 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
56 }
57
58 /* Send STOP condition */
59 I2C_GenerateSTOP(macI2Cx, ENABLE);
60
61 return 1; //正常返回1
62 }
IIC事件检测:498页。STM32的硬件IIC通信非常严格,每一步都要检测相应的标志位是否正确,确保通信不会出错。
1 /**
2 * @brief 从I2C设备里面读取一块数据
3 * @param
4 * @arg pBuffer:存放从slave读取的数据的缓冲区指针
5 * @arg WriteAddr:接收数据的从设备的地址
6 * @arg NumByteToWrite:要从从设备读取的字节数
7 * @retval 正常返回1,异常返回0
8 */
9 uint8_t I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
10 {
11 I2CTimeout = I2CT_LONG_TIMEOUT;
12
13 while(I2C_GetFlagStatus(macI2Cx, I2C_FLAG_BUSY)) // Added by Najoua 27/08/2008
14 {
15 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
16 }
17
18 I2C_GenerateSTART(macI2Cx, ENABLE);
19
20 I2CTimeout = I2CT_FLAG_TIMEOUT;
21
22 /* Test on EV5 and clear it */
23 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))
24 {
25 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
26 }
27
28 /* Send slave address for write */
29 I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);
30
31 I2CTimeout = I2CT_FLAG_TIMEOUT;
32
33 /* Test on EV6 and clear it */
34 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
35 {
36 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
37 }
38
39 /* Clear EV6 by setting again the PE bit */
40 I2C_Cmd(macI2Cx, ENABLE);
41
42 /* Send the slave's internal address to write to */
43 I2C_SendData(macI2Cx, ReadAddr);
44
45 I2CTimeout = I2CT_FLAG_TIMEOUT;
46
47 /* Test on EV8 and clear it */
48 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
49 {
50 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
51 }
52
53 /* Send STRAT condition a second time */
54 I2C_GenerateSTART(macI2Cx, ENABLE);
55
56 I2CTimeout = I2CT_FLAG_TIMEOUT;
57 /* Test on EV5 and clear it */
58 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))
59 {
60 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
61 }
62
63 /* Send slave address for read */
64 I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Receiver);
65
66 I2CTimeout = I2CT_FLAG_TIMEOUT;
67
68 /* Test on EV6 and clear it */
69 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
70 {
71 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
72 }
73
74 /* While there is data to be read */
75 while(NumByteToRead)
76 {
77 if(NumByteToRead == 1)
78 {
79 /* Disable Acknowledgement */
80 I2C_AcknowledgeConfig(macI2Cx, DISABLE);
81
82 /* Send STOP Condition */
83 I2C_GenerateSTOP(macI2Cx, ENABLE);
84 }
85
86 /* Test on EV7 and clear it */
87 if(I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))
88 {
89 /* Read a byte from the slave */
90 *pBuffer = I2C_ReceiveData(macI2Cx);
91
92 /* Point to the next location where the byte read will be saved */
93 pBuffer++;
94
95 /* Decrement the read bytes counter */
96 NumByteToRead--;
97 }
98 }
99
100 /* Enable Acknowledgement to be ready for another reception */
101 I2C_AcknowledgeConfig(macI2Cx, ENABLE);
102
103 return 1; //正常,返回1
104 }
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 04:14 编辑 [local]2[/local]“TI”杯时我们三人的作品。 三角波参数测试仪。 … 查看全部问答> |
|
目录: 第一章 线性电路的复数解法 1.1 电源与元件的概念 1.2 常参量线性电路的复数解法 1.3 一阶RC滤波器 1.4 二级LC滤波器 思考题 习题 第二章 线性电路的s域解法 2.1 拉普拉斯变换 2.2 线性电路的s域解法 2.3 卷积 附录2 拉氏变换 ...… 查看全部问答> |
|
整快板子上的外设不是很多,但是存储器资源丰富。并预留了一个HSMC接口,可以用来扩展。有三张光盘,一张是介绍开发板的使用,例程,入门指导,另两张是Quartus2的软件,常用库,NIOS2开发资料。先简单介绍到这里,把开发板的资料传上来共享(全部 ...… 查看全部问答> |
|
本人一直在一家电源IC原厂华东区做FAE,07年公司从linear挖了一个团队进入LED驱动行业,我随之也开始进入这个行业。在勤勤勉勉的耕耘3年中,我从学习到与客户分享我的学习经验,很多客户都会跟我讲,王工,从你身上我学到了很多。但这时我告诫自己 ...… 查看全部问答> |
|
如何设置vxworks(主机)的IP地址,和网关?如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗 如何设置vxworks(主机)的IP地址,和网关????????? 如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗?? … 查看全部问答> |
|
MSP430 电容单触式传感器设计指南,这是官网应用手册,很权威的。 [ 本帖最后由 鑫海宝贝 于 2011-10-12 09:35 编辑 ]… 查看全部问答> |




