佚名通过本文主要向大家介绍了stm32f103ze,stm32f103ze中文资料,stm32f103ze引脚图,stm32f103ze例程,stm32f103ze数据手册等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: STM32F103ZE战舰版IIC通信配置问题
描述:
源程序为:
#include "includes.h"
//#define SIZE sizeof(buffer)
/*
IIC初始化:
1.根据数据手册找到GPIO口
24c02 STM32
SDA -- GPIOB11 -- I2C2_SDA
SCL -- GPIOB10 -- I2C2_SCL
把GPIO口配置为复用开漏输出型
2.初始化IIC时钟和GPIOB时钟
3.配置GPIO口
4.配置IIC
1.GPIO口函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2.RCC函数
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
3.IIC函数
void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);
void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);//允许单字节应答模式
*/
/****************************************************
函数名:IIC_Init
形参:
返回值:
函数功能:IIC初始化
****************************************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
//初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
//配置IO口功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 |GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//IIC模式
// I2C_InitStructure.I2C_OwnAddress1 = 0x0A;//作为从机地址
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//地址的位数
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//选择有应答信号
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;//配置高低电平比例
I2C_InitStructure.I2C_ClockSpeed = 200000;//配置时钟
I2C_Init(I2C2,&I2C_InitStructure);
I2C_Cmd(I2C2,ENABLE);
}
/*
页写
1.判断IIC SDA线上是否繁忙
FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);
2.发送开始信号
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);
3.等待开始信号完成
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);
4.发送器件地址
void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);
5.判断地址是否发送完成
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);
6.发送8位数据(代表字地址)
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);
7.等待发送完成
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);//
8.发送最多8个字节的数据
9.产生停止信号
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);
*/
/****************************************************
函数名:IIC_WritePage
形参: Addr -- 从机地址
Subaddr -- 从机字地址
Lenth -- 要发送的字符的个数
返回值:
函数功能:字节写/页写
****************************************************/
void IIC_WritePage(u8 Addr,u8 Subaddr,u8 *Data,u16 Lenth)
{
u16 i;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));//繁忙为真,不繁忙为假
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
printf("1\r\n");
I2C_Send7bitAddress(I2C2,Addr,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
printf("2\r\n");
I2C_SendData(I2C2,Subaddr);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
printf("3\r\n");
for(i=0;i<Lenth;i++)
{
I2C_SendData(I2C2,Data[i]);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
}
I2C_GenerateSTOP(I2C2,ENABLE);
}
/*
顺序读:
1.检测SDA是否忙
2.开始信号
3.检测开始信号发送完成
4.发送器件地址
5.检测器件地址发送完成
6.发送字地址
7.检测字地址发送完成
8.开始信号
9.检测开始信号发送完成
10.发送器件地址(改为读模式)//事件6的接收模式
11.检测器件地址发送完成
12.判断从机是否发送来数据
13.读取数据
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);
14.重复12 13到Lenth-1次
15.最后一次数据接收不让STM32给AT24c02发送应答信号
16.接收最后的数据
17.产生停止信号
18.打开应答使能
*/
/****************************************************
函数名:IIC_Roundread
形参: Addr -- 从机地址
Subaddr -- 字地址
Lenth -- 读取数据的长度
返回值:
函数功能:AT24C02的顺序读
****************************************************/
void IIC_Roundread(u8 Addr,u8 Subaddr,u8 *Data,u16 Lenth)
{
u16 i;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
I2C_Send7bitAddress(I2C2,Addr,I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
printf("6\r\n");
I2C_SendData(I2C2,Subaddr);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
printf("7\r\n");
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
printf("8\r\n");
I2C_Send7bitAddress(I2C2,Addr,I2C_Direction_Receiver);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS);
printf("9\r\n");
for(i=0;i<Lenth-1;i++)
{
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS);
Data[i] = I2C_ReceiveData(I2C2);
}
printf("10\r\n");
I2C_AcknowledgeConfig(I2C2,DISABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS);
printf("11\r\n");
Data[i] = I2C_ReceiveData(I2C2);
I2C_GenerateSTOP(I2C2,ENABLE);
I2C_AcknowledgeConfig(I2C2,ENABLE);
}
/*
1.给AT24C02中通过页写,把256个字节的空间写满
2.从AT24C02中通过顺序读,把256个字节读出
*/
/****************************************************
函数名:IIC_Test
形参:
返回值:<
描述:
STM32 IIC 配置 嵌入式 单片机STM32IIC单片机嵌入式
各位大神,谁来帮我看看我的IIC配置问题啊(库函数版本),写AT24C02芯片时为什么会死在I2C_Send7bitAddress(I2C2,Addr,I2C_Direction_Transmitter);while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);源程序为:
#include "includes.h"
//#define SIZE sizeof(buffer)
/*
IIC初始化:
1.根据数据手册找到GPIO口
24c02 STM32
SDA -- GPIOB11 -- I2C2_SDA
SCL -- GPIOB10 -- I2C2_SCL
把GPIO口配置为复用开漏输出型
2.初始化IIC时钟和GPIOB时钟
3.配置GPIO口
4.配置IIC
1.GPIO口函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2.RCC函数
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
3.IIC函数
void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);
void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);//允许单字节应答模式
*/
/****************************************************
函数名:IIC_Init
形参:
返回值:
函数功能:IIC初始化
****************************************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
//初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
//配置IO口功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 |GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//IIC模式
// I2C_InitStructure.I2C_OwnAddress1 = 0x0A;//作为从机地址
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//地址的位数
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//选择有应答信号
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;//配置高低电平比例
I2C_InitStructure.I2C_ClockSpeed = 200000;//配置时钟
I2C_Init(I2C2,&I2C_InitStructure);
I2C_Cmd(I2C2,ENABLE);
}
/*
页写
1.判断IIC SDA线上是否繁忙
FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);
2.发送开始信号
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);
3.等待开始信号完成
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);
4.发送器件地址
void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);
5.判断地址是否发送完成
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);
6.发送8位数据(代表字地址)
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);
7.等待发送完成
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);//
8.发送最多8个字节的数据
9.产生停止信号
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);
*/
/****************************************************
函数名:IIC_WritePage
形参: Addr -- 从机地址
Subaddr -- 从机字地址
Lenth -- 要发送的字符的个数
返回值:
函数功能:字节写/页写
****************************************************/
void IIC_WritePage(u8 Addr,u8 Subaddr,u8 *Data,u16 Lenth)
{
u16 i;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));//繁忙为真,不繁忙为假
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
printf("1\r\n");
I2C_Send7bitAddress(I2C2,Addr,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
printf("2\r\n");
I2C_SendData(I2C2,Subaddr);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
printf("3\r\n");
for(i=0;i<Lenth;i++)
{
I2C_SendData(I2C2,Data[i]);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
}
I2C_GenerateSTOP(I2C2,ENABLE);
}
/*
顺序读:
1.检测SDA是否忙
2.开始信号
3.检测开始信号发送完成
4.发送器件地址
5.检测器件地址发送完成
6.发送字地址
7.检测字地址发送完成
8.开始信号
9.检测开始信号发送完成
10.发送器件地址(改为读模式)//事件6的接收模式
11.检测器件地址发送完成
12.判断从机是否发送来数据
13.读取数据
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);
14.重复12 13到Lenth-1次
15.最后一次数据接收不让STM32给AT24c02发送应答信号
16.接收最后的数据
17.产生停止信号
18.打开应答使能
*/
/****************************************************
函数名:IIC_Roundread
形参: Addr -- 从机地址
Subaddr -- 字地址
Lenth -- 读取数据的长度
返回值:
函数功能:AT24C02的顺序读
****************************************************/
void IIC_Roundread(u8 Addr,u8 Subaddr,u8 *Data,u16 Lenth)
{
u16 i;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
I2C_Send7bitAddress(I2C2,Addr,I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
printf("6\r\n");
I2C_SendData(I2C2,Subaddr);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
printf("7\r\n");
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
printf("8\r\n");
I2C_Send7bitAddress(I2C2,Addr,I2C_Direction_Receiver);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS);
printf("9\r\n");
for(i=0;i<Lenth-1;i++)
{
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS);
Data[i] = I2C_ReceiveData(I2C2);
}
printf("10\r\n");
I2C_AcknowledgeConfig(I2C2,DISABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS);
printf("11\r\n");
Data[i] = I2C_ReceiveData(I2C2);
I2C_GenerateSTOP(I2C2,ENABLE);
I2C_AcknowledgeConfig(I2C2,ENABLE);
}
/*
1.给AT24C02中通过页写,把256个字节的空间写满
2.从AT24C02中通过顺序读,把256个字节读出
*/
/****************************************************
函数名:IIC_Test
形参:
返回值:<