社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 2629|回复: 7

[求助] PIC32MZ的硬件I2C

[复制链接]

1366

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2014-8-2 11:00:36 | 显示全部楼层 |阅读模式
我现在调到PIC32MZ的I2C,本来想用PIC官方的harmony库函数来写一个初始化MPU6050的程序。但试了两三天也不行,无奈之下看了PIC32MZ的I2C参考手册的那部分。写了一个寄存器版的读取MPU6050的程序。当还是有问题。
我的代码是:

  1. void I2C1_Init()
  2. {
  3.     uint32_t actualClock;
  4.     PLIB_I2C_BaudRateSet ( MY_I2C_ID, MY_CLOCK_FREQUENCY, MY_BAUD_RATE);
  5.     actualClock = PLIB_I2C_BaudRateGet ( MY_I2C_ID, MY_CLOCK_FREQUENCY );
  6.     if(abs(actualClock-MY_BAUD_RATE) > MY_BAUD_RATE/10);
  7.     {
  8.         while(1);
  9.     }
  10.     I2C1CONbits.A10M = 0;
  11.     I2C1CONbits.SMEN = 0;
  12.     I2C1CONbits.ON = 1;

  13. }

  14. void I2C1_Start()
  15. {
  16.     I2C1CONbits.SEN = 1;
  17.     while(I2C1STATbits.P);
  18. }
  19. void I2C1_SendData(uint8_t Data)
  20. {
  21.     I2C1TRNbits.I2CTRN = Data;
  22.     while(I2C1STATbits.TBF);
  23. }

  24. void I2C1_Stop()
  25. {
  26.     I2C1CONbits.PEN = 1;
  27. }
  28. #define OAR1_ADD0_Set ((uint16_t)0x0001)
  29. #define OAR1_ADD0_Reset ((uint16_t)0xFFFE)
  30. void Send7bitsAddress(uint8_t Address,uint8_t I2C_Direction)
  31. {
  32.     if(I2C_Direction == 0)
  33.     {
  34.         Address |= OAR1_ADD0_Set;
  35.     }
  36.     else
  37.     {
  38.         Address &= OAR1_ADD0_Reset;
  39.     }
  40.     I2C1TRNbits.I2CTRN = Address;
  41. }

  42. void I2C_Byte_Write(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t REG_data)
  43. {
  44.     I2C1_Start();
  45.     Send7bitsAddress(SlaveAddress,1);
  46.     while(I2C1STATbits.R_W);
  47.     while(I2C1STATbits.TBF);
  48.     I2C1_SendData(REG_Address);
  49.     while(I2C1STATbits.TBF);
  50.     I2C1_SendData(REG_data);
  51.     while(I2C1STATbits.TBF);
  52.     I2C1_Stop();

  53. }

  54. void MPU_6050_Init(void)
  55. {
  56.     I2C_Byte_Write(MPU6050_SlaveAddress,PWR_MGMT_1,0x00);
  57.     delay(50000);
  58.     I2C_Byte_Write(MPU6050_SlaveAddress,SMPLRT_DIV,0x07);
  59.     delay(50000);
  60.     I2C_Byte_Write(MPU6050_SlaveAddress,MPU6050_CONFIG,0x06);
  61.     delay(50000);
  62.     I2C_Byte_Write(MPU6050_SlaveAddress,GYRO_CONFIG,0x08);
  63.     delay(50000);
  64.     I2C_Byte_Write(MPU6050_SlaveAddress,ACCEL_CONFIG,0x08);
  65. }

  66. int main ( void )
  67. {
  68.     SYS_DEVCON_PerformanceConfig(SYS_CLK_FREQUENCY);
  69.     I2C1_Init();
  70.     while(1)
  71.     {
  72.        MPU_6050_Init();
  73.     }

  74.   /*
  75.    Initialize the application. */
  76. /* SYS_Initialize(NULL);

  77.     while (true)
  78.     {
  79.         // Maintain the application's state machine.
  80.         SYS_Tasks();
  81.     }
  82. */
  83.     /* Should not come here during normal operation */
  84.     PLIB_ASSERT(false, "leaving main");
  85.    
  86.     return (EXIT_FAILURE);
  87. }
复制代码

但总是卡死在了while(1)的那句话,我想也想不明白我已经设置了100K的SCL频率,但还是有超过10%的误差。
第二个问题是卡在了while(I2C1STATbits.TBF);这句话,就是得不到应答。
求大神解救!!!希望我的问题能得到解决。
此帖出自PIC单片机论坛


回复

使用道具 举报

433

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-18 22:50:28 | 显示全部楼层
通过IO口来模拟试一下,说不定,更快捷


回复

使用道具 举报

2863

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2016-10-4 19:33:12 | 显示全部楼层
gfx_camera是使用IIC通信的例程,可参考


回复

使用道具 举报

738

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

发表于 2016-10-4 20:04:11 | 显示全部楼层
我想问能跳得出来么,while(1)了,又没有break,怎么能跳出去

点评

那时候写的程序逻辑还是有点问题  详情 回复 发表于 2017-1-9 21:37
亚里士缺德


回复

使用道具 举报

1366

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

 楼主| 发表于 2017-1-9 21:37:36 | 显示全部楼层
汤权 发表于 2016-10-4 20:04
我想问能跳得出来么,while(1)了,又没有break,怎么能跳出去

那时候写的程序逻辑还是有点问题


回复

使用道具 举报

477

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-1-19 09:43:05 | 显示全部楼层
楼上正解,如果有示波器的话示波器看一下更直观。如果可以的话拍个照片发上来


回复

使用道具 举报

580

TA的帖子

3

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-19 14:17:58 | 显示全部楼层
调试I2c是需要看波形的

点评

这个我知道的,我现在挂个逻辑分析仪  详情 回复 发表于 2017-1-22 00:02
京微齐力HME-M7——单片机开发者的进阶之选


回复

使用道具 举报

1366

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

 楼主| 发表于 2017-1-22 00:02:45 | 显示全部楼层
le062 发表于 2017-1-19 14:17
调试I2c是需要看波形的

这个我知道的,我现在挂个逻辑分析仪


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-5-28 03:59 , Processed in 0.234347 second(s), 19 queries , Gzip On, Redis On.

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