打印

[求助] C8051F SMbus 读写问题

[复制链接]
3408|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用 C8051F550单片机 读写 I2C器件,不成功。不知道是什么原因。希望用过的帮我看看哪里配置不对还是出现了冲突。
数据通过CAN与上位机通信,这一部分已经验证是正常的。
好像 SMBus 没有工作。
因为 ADXL345 有它的device ID在 寄存器地址0x00,值是0xE5(八进制0345)。但是发现数据不对。

SMBus 时钟 56K,使用T1为其时钟源,T3溢出值为SCL低电平超时。使用主从模式,C8051F始终为主机。
操作函数有:
对相应地址写单字节数据 void ADXL345_ByteWrite(U8 addr, U8 dat);
读相应地址单字节数据     U8   ADXL345_ByteRead(U8 addr);
读相应地址多字节数据    void ADXL345_ReadArray(U8* dest_addr, U8 src_addr, U8 len);

ADXL345初始化函数       void Init_ADXL345(void);
读取ADXL345加速度值   即将ADXL345内部寄存器地址0x32-0x37 的数据读到 ADX_BUF[8]里面.

SMBus 正常工作的函数 应该涉及有: [这些都是从 F550的Demo里面复制过来的]
void SMBUS0_Init(void);                // SMBus 初始化
void TIMER1_Init(void);                // SMBus 时钟使用 T1溢出
void TIMER3_Init(void);                // SMBus SCL低电平超时使用T3

INTERRUPT_PROTO (TIMER3_ISR, INTERRUPT_TIMER3);    // SCL低电平超时 使用T3中断恢复SMBus总线
INTERRUPT_PROTO (SMBUS0_ISR, INTERRUPT_SMBUS0);    // SMBus 状态中断

SMBus_ISR-3.jpg (78.74 KB )

SMBus_ISR-3.jpg

SMBus_ISR-2.jpg (66.67 KB )

SMBus_ISR-2.jpg

SMBus_ISR-1.jpg (106.31 KB )

SMBus_ISR-1.jpg

SMBus初始化函数.jpg (87 KB )

SMBus初始化函数.jpg

T1 初始化.jpg (75.1 KB )

T1 初始化.jpg

T3初始化.jpg (41.5 KB )

T3初始化.jpg

T3ISR.jpg (39.19 KB )

T3ISR.jpg

读 三轴加速度值.jpg (37.98 KB )

读 三轴加速度值.jpg

读多字节数据函数.jpg (94.75 KB )

读多字节数据函数.jpg

读内部寄存器数据函数.jpg (102.1 KB )

读内部寄存器数据函数.jpg

端口配置.jpg (54.97 KB )

端口配置.jpg

向内部寄存器写数据函数.jpg (100.36 KB )

向内部寄存器写数据函数.jpg

main.jpg (86.18 KB )

main.jpg

F560_SMBus_EEPROM.zip

6.46 KB

相关帖子

沙发
J-Link-MM|  楼主 | 2013-4-26 11:00 | 只看该作者
求推广,来拯救我吧~
定位不了问题,希望大家多多指导!

使用特权

评论回复
板凳
J-Link-MM|  楼主 | 2013-4-26 11:03 | 只看该作者
有一个 直接用 I/O 口实现 I2C的不知道为什么也不能工作。

使用特权

评论回复
地板
ayb_ice| | 2013-4-26 11:04 | 只看该作者
官网例程一大堆

使用特权

评论回复
5
ningling_21| | 2013-4-26 12:08 | 只看该作者
J-Link-MM 发表于 2013-4-26 11:03
有一个 直接用 I/O 口实现 I2C的不知道为什么也不能工作。

模拟I2C不能工作,肯定是程序的问题.

使用特权

评论回复
6
J-Link-MM|  楼主 | 2013-4-26 14:28 | 只看该作者
ningling_21 发表于 2013-4-26 12:08
模拟I2C不能工作,肯定是程序的问题.

都是按时序来的,不知道问题出在哪。

使用特权

评论回复
7
J-Link-MM|  楼主 | 2013-4-26 14:29 | 只看该作者
ayb_ice 发表于 2013-4-26 11:04
官网例程一大堆

用的就是例程啊。

使用特权

评论回复
8
ningling_21| | 2013-4-26 14:42 | 只看该作者
J-Link-MM 发表于 2013-4-26 14:28
都是按时序来的,不知道问题出在哪。

交叉开关,输入输出方式设置对了吗?

使用特权

评论回复
9
J-Link-MM|  楼主 | 2013-4-26 15:39 | 只看该作者
ningling_21 发表于 2013-4-26 14:42
交叉开关,输入输出方式设置对了吗?

交叉开关是正确的,输入输出也是对的。
   P0MDOUT |= 0x40;                   // P0.6 (CAN0 TX) is push-pull
   P0MDOUT |= 0x04;                   // P0.2 (LED) is push-pull

   P0MDOUT |= 0x38;
   ADX_EN   = 1;                                          // 片选 ADXL345
   SDA      = 1;
   SCL      = 1;

   P1SKIP  |= 0xE0;                                           // 配置ADC 输入
   P1MDIN  &= 0x1F;                                           // 0: 模拟输入 1: 非模拟输入
                                                                           // P1.5 P1.6 P1.7
   P2SKIP  |= 0x01;                                           // P2.0
   P2MDIN  &= 0xFE;

   P0SKIP  |= 0x0F;
   XBR0     = 0x0A;                    // Enable CAN0 on Crossbar
                                                                           // 使能SMBus
   XBR2     = 0x40;                    // Enable Crossbar and weak pull-ups

   SFRPAGE = SFRPAGE_save;

使用特权

评论回复
10
ayb_ice| | 2013-4-26 17:16 | 只看该作者
把中断关掉测试
或关键地方关中断

使用特权

评论回复
11
J-Link-MM|  楼主 | 2013-4-26 22:53 | 只看该作者
解开谜团,上拉电阻太大!
悲催!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

50

帖子

0

粉丝