OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5744|回复: 9

关于I2C的使用方法

[复制链接]

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
发表于 2015-1-16 16:19:30 | 显示全部楼层 |阅读模式
5金钱

我最初的思路是想往24C02写入数据,然后读出的数据赋值给LED灯,或者读出的数据在串口中显示出来,但是没有成功,困扰了我两天,另外还发现了一个BUG,当我配置USART_ITConfig(USART1, USART_IT_TXE, ENABLE);串口发送中断使能的时候,GPIOA->BSRR = 11<<2;这些I/O寄存器语句会失效,不知道为什么,代码我是用原子的myiic,24cxx的,然后还有一个主函数,我贴主函数出来,请大家帮忙分析下。myiic,24cxx是没改动过的,我的板子的I/O口不是和原子的一样,这里我也改动过了。

#include "delay.h"
#include "sys.h"
#include "myiic.h"
#include "24cxx.h"

void GPIO_init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE);  //????PA?????±??
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 ;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure); 
  //GPIO_SetBits(GPIOA,GPIO_Pin_2 | GPIO_Pin_3);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
   
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  //USART ?????è??
  USART_InitStructure.USART_BaudRate = 9600;//??°??è????9600; ???????????????? 8??????×???
  USART_InitStructure.USART_WordLength = USART_WordLength_8b; //×??¤
  USART_InitStructure.USART_StopBits = USART_StopBits_1;   //????????????°??¨???­?é???????????è????1????
  USART_InitStructure.USART_Parity = USART_Parity_No;     //?????????ì?é????
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //?????????÷????
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //?????®??????????
  USART_Init(USART1, &USART_InitStructure);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  USART_Cmd(USART1, ENABLE);   
}

//void USART1_IRQHandler(void)       //??????,???????????
//{
//  u16 temp_trx;
//  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//?? ?? ???? 
//  {
//  temp_trx = USART_ReceiveData(USART1);
//  GPIOA->ODR = USART_ReceiveData(USART1);
//  //AT24CXX_WriteOneByte(10,0x0c);
//  //USART_SendData(USART1,AT24CXX_ReadOneByte(10));
//  USART_SendData(USART1,temp_trx);
//    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//?? ????
// }
//}


int main()

  GPIO_init();
  //GPIOA->BSRR = 11<<2;
  AT24CXX_Init();
  AT24CXX_WriteOneByte(0,0x0c);
  GPIOA->ODR = AT24CXX_ReadOneByte(0);
  while(1)
  {
   USART_SendData(USART1,AT24CXX_ReadOneByte(0));
   while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//?? ????
  }

}

最佳答案

查看完整内容[请看2#楼]

已经解决了,自己重新写了一遍时序,没有用原子哥的,感觉时序这个东西,不一定都和别人代码一样,只要能够达到效果,多写几行或者少写几行问题都不大。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-16 16:19:31 | 显示全部楼层
已经解决了,自己重新写了一遍时序,没有用原子哥的,感觉时序这个东西,不一定都和别人代码一样,只要能够达到效果,多写几行或者少写几行问题都不大。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-16 20:25:20 | 显示全部楼层
慢慢调试,先把24Cxx驱动起来吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-16 21:16:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
主要是觉得想不通,而且感觉时序图学习起来特别难,不知道原子哥当初会有这么的感觉吗,还是我自己能力问题,忧伤。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-16 23:33:47 | 显示全部楼层
回复【3楼】Fong0716:
---------------------------------
多花时间就好了
初学者就应该多花时间,比如一周时间去搞IIC,肯定可以搞得滚瓜烂熟了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-17 10:16:48 | 显示全部楼层
现在是可以通过写入数据到24c02中,读出来的数据赋值给LED,亮暗也正常,但是把读到的数据发送到串口,是没有反应
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-17 10:44:25 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
串口没反应,原来是新建工程的时候少了CMSIS的keil RTX,这个是时钟的驱动吗? 串口有反应后,但是读出来的数据是FF,但是读函数的数据返回的值给LED灯,亮暗是正常的啊,这是什么问题。。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-1
在线时间
0 小时
发表于 2015-4-24 15:28:35 | 显示全部楼层
回复【7楼】Fong0716:
---------------------------------
老兄 问题解决了吗  我想看代码
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-5-22 10:42:11 | 显示全部楼层
回复【8楼】日月成明:
---------------------------------
解决了
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-5-22 10:44:35 | 显示全部楼层
回复【8楼】日月成明:
---------------------------------
时间过太久了,当初的问题都不太记得了,看回当时写下的解决方法你看看能不能帮助到你吧
1.I2C的程序调试中,IO方向设置为0X8FFFFFFF,这个设置模式会影响I2C的程序,导致运行结果不正确。
正确的设置方法如下:
//IO方向设置 
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X80000000;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;}

2.串口调试中,若不使用串口中断,则把使能中断的函数屏蔽,不然会出现,串口发送失败。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 05:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表