• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > STM32F103ZE战舰版IIC通信配置问题

STM32F103ZE战舰版IIC通信配置问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了stm32f103ze,stm32f103ze中文资料,stm32f103ze引脚图,stm32f103ze例程,stm32f103ze数据手册等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: STM32F103ZE战舰版IIC通信配置问题
描述:

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
形参:
返回值:<
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • STM32F103ZE战舰版IIC通信配置问题
  • stm32f103的DAC模块,配置完成后用万用表测始终输出0V
  • stm32F103ZET6PWM捕获不到
  • stm32f103zet6编译环境mdk517usb部分函数库函数求解释!头文件:rl_usbh

相关文章

  • 2017-06-05 80386支持的虚拟地址空间可达64T字节。64T指的是什么意思?
  • 2017-06-05 VC60IDE里设置为编译驱动的问题!
  • 2017-06-05 [STM32L0]STM32LO5读保护设置出错
  • 2017-06-05 自己写了温湿度SHT11的协议但测量出的值错误,不知道哪里错了。
  • 2017-06-05 请问如何使用调用USB接口输出硬件鼠标键盘信号到另一个电脑上面?
  • 2017-06-05 移植rtl8188cuUSBwifi应用界面打开wifi时,按键亮,但是检测不到信息
  • 2017-06-05 4412是三星的四核处理器,为什么启动以后有一些核心自己关闭了?
  • 2017-06-05 怎样写串行打印机驱动?
  • 2017-06-05 如何从显存读取屏幕内容
  • 2017-06-05 C51编译时关于头文件intrinsh的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 高分请教ntStatus为c0000010STATUS_INVALID_DEVICE_REQUEST的原因?
    • 视窗驱动研发?
    • 如何通过程序读取cpu温度
    • 肉鸡ip段arp不同网段的ip时会发生什么?
    • 新人求助求助
    • 菜鸟问一个很简单的问题!
    • 浮点乘法器,由于设计原因两个输入不能同步
    • 请教各位大神WiFi模块选型的问题
    • Nosoundcardsfound
    • 请教StreamClassMinidriver的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有