[MM32硬件] 【灵动微评测报告】IIC调试通过,读写24C02成功

[复制链接]
 楼主| WoodData 发表于 2020-4-21 21:52 | 显示全部楼层 |阅读模式
     板子上有个24C02的EEPROM存储器,I2C接口,花了一些时间终于调试好了。参考下载的官方例子,需要注意的是写数据后要延时几个毫秒。

    I2C接口在PB6,PB7。
QQ截图20200421214110.jpg
QQ截图20200421214040.jpg
QQ截图20200421214145.jpg
i2C代码:
  1. /********************************************************************************************************
  2. **函数信息 :I2CTXEmptyCheck(I2C_TypeDef *I2Cx)                 
  3. **功能描述 :检查发送中断标志位
  4. **输入参数 :I2C_TypeDef *I2Cx,选择I2C1,I2C2
  5. **输出参数 :无
  6. ********************************************************************************************************/
  7. void I2CTXEmptyCheck(I2C_TypeDef *I2Cx)
  8. {
  9.     while(1)
  10.     {
  11.         if(I2C_GetFlagStatus(I2Cx, I2C_FLAG_TX_EMPTY))
  12.         {
  13.             break;
  14.         }
  15.     }
  16. }
  17. /********************************************************************************************************
  18. **函数信息 :I2CTXEmptyCheck(I2C_TypeDef *I2Cx)                 
  19. **功能描述 :检查接收中断标志位
  20. **输入参数 :I2C_TypeDef *I2Cx,选择I2C1,I2C2
  21. **输出参数 :无
  22. ********************************************************************************************************/
  23. void I2CRXFullCheck(I2C_TypeDef *I2Cx)
  24. {   
  25.     while(1)
  26.     {
  27.         if(I2C_GetFlagStatus(I2Cx, I2C_FLAG_RX_FULL))
  28.         {
  29.             break;
  30.         }       
  31.     }
  32. }
  33. /********************************************************************************************************
  34. **函数信息 :I2CTXByte(I2C_TypeDef *I2Cx,unsigned short cmd,unsigned char temp)              
  35. **功能描述 :I2C发送数据
  36. **输入参数 :I2C_TypeDef *I2Cx,选择I2C1,I2C2;cmd;temp
  37. **输出参数 :无
  38. ********************************************************************************************************/
  39. void I2CTXByte(I2C_TypeDef *I2Cx,unsigned short cmd,unsigned char temp)
  40. {
  41.     I2C_SendData(I2Cx, temp);
  42.     I2CTXEmptyCheck(I2Cx);
  43.    
  44. }
  45. /********************************************************************************************************
  46. **函数信息 :I2CRXByte(I2C_TypeDef *I2Cx)            
  47. **功能描述 :I2C接收数据
  48. **输入参数 :I2C_TypeDef *I2Cx,选择I2C1,I2C2
  49. **输出参数 :temp
  50. ********************************************************************************************************/
  51. unsigned char I2CRXByte(I2C_TypeDef *I2Cx)
  52. {
  53.     unsigned short temp;
  54.    
  55.     I2CRXFullCheck(I2Cx);   
  56.     temp = I2C_ReceiveData(I2Cx);
  57.     return (unsigned char)temp;
  58. }


  59. //============================================================================
  60. //
  61. //
  62. //
  63. //============================================================================
  64. void I2C_WriteByte(unsigned char dev_addr, unsigned int addr,unsigned char Byte)
  65. {
  66.         I2C_PageWrite(dev_addr,addr,&Byte,1);
  67. }

  68. unsigned char I2C_ReadByte(unsigned char dev_addr, unsigned int addr)
  69. {
  70.         unsigned char Byte;
  71.         I2C_PageRead(dev_addr,addr,&Byte,1);
  72.     return Byte;
  73. }

  74. uint32_t I2C_PageWrite(unsigned char dev_addr,unsigned int addr,unsigned char *str,unsigned int num)
  75. {
  76.     unsigned short temp;
  77.     unsigned short i;
  78.     unsigned char *p;
  79.        
  80.     p = str;
  81.    
  82.     I2C_Cmd(I2C1, DISABLE);
  83.     I2C_Send7bitAddress(I2C1, dev_addr<<1, I2C_Direction_Transmitter);
  84.     I2C_Cmd(I2C1, ENABLE);
  85.     temp = ((addr) & 0xff);
  86.     I2CTXByte(I2C1,CMD_WRITE,temp);  //tx memory addr
  87.    
  88.     for(i=0;i<num;i++)
  89.     {
  90.         temp = *p;
  91.         p++;
  92.         if(i==(num-1))
  93.             I2C1->IC_DATA_CMD =temp| 0x200; // //muaul set stop flag
  94.         else
  95.             I2CTXByte(I2C1,CMD_WRITE,temp); //tx data
  96.     }       
  97.         return     0;
  98. }

  99. uint32_t I2C_PageRead(unsigned char dev_addr,unsigned int addr,unsigned char *str,unsigned int num)
  100. {
  101.     unsigned char temp=0;
  102.     unsigned short i;

  103.     I2C_Cmd(I2C1, DISABLE);   
  104.     I2C_Send7bitAddress(I2C1, dev_addr<<1, I2C_Direction_Transmitter);
  105.     I2C_Cmd(I2C1, ENABLE);
  106.     temp = ((addr) & 0xff);   
  107.     I2CTXByte(I2C1,CMD_WRITE,temp);  //tx memory addr  
  108.        
  109.     I2C_Send7bitAddress(I2C1, dev_addr<<1, I2C_Direction_Receiver);
  110.        
  111.     for(i=0;i<num;i++)
  112.     {
  113.         str[i] = I2CRXByte(I2C1);
  114.     }
  115.        
  116.         I2C1->IC_DATA_CMD = 0x200; // //set stop flag
  117.        
  118.     return 0;   
  119. }


下面是串口数据输出:
QQ截图20200421213536.jpg

QQ截图20200421214301.jpg


评论

可以加个微信,了解下怎么在PC上调试I2C吗?  发表于 2020-6-18 10:02
coslight 发表于 2020-4-22 11:16 | 显示全部楼层
请问您这个com口的打印咋做出来的,我的mm32-link的扩展串口怎么也不输出,不知道咋回事
 楼主| WoodData 发表于 2020-4-22 11:18 | 显示全部楼层
coslight 发表于 2020-4-22 11:16
请问您这个com口的打印咋做出来的,我的mm32-link的扩展串口怎么也不输出,不知道咋回事 ...

我的也不输出的,都是外接USB转串口模块输出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

4784

帖子

28

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