搜索
bottom↓
回复: 6

高手帮忙,UC3C2512读I2C,读回的数据和地址一样

[复制链接]

出0入4汤圆

发表于 2012-4-2 23:51:34 | 显示全部楼层 |阅读模式
现在正在用UC3C2512+DS3231(I2C RTC)
工程用的是UC3C-EK的AT24xx
修改了芯片为UC3C2512,I2C地址为0x68(DS3231的地址)
晶振是14.7456,修改define
#define FOSC0 14745600
#define BOARD_OSC0_HZ 14745600
#define FCPU_HZ 14745600
#define FPBA_HZ 14745600

主程序只作了很小修改
// main function
int main(void) {
init_sys_clocks();
init_dbg_rs232(FPBA_HZ);
print_dbg("AT24CXX Example\r\n");

irq_initialize_vectors();


twi_init();

/* Power up delay: This device needs a maximum of 230ms before it
* can be accessed. Another method would be to wait until the the
* detect line goes low but this won't work during a debugging session
* since the device is not reset.*/
cpu_delay_ms(230, FCPU_HZ);
// 不需要LED

at24cxx_init(FCPU_HZ);
//不需要写
//print_dbg("Write @0: 0x55 - @1: 0xAA");
//at24cxx_write_byte(0,0x55);
//at24cxx_write_byte(1,0xaa);
//print_dbg("- Done\r\n");

// !!! read 0x13 bytes
U8 tmp1,tmp2;
for(tmp1=0;tmp1<=0x12;tmp1++)
{
tmp2 = at24cxx_read_byte(tmp1);
print_dbg("Read @0x");
print_dbg_char_hex(tmp1);
print_dbg(": 0x");
print_dbg_char_hex(tmp2);
print_dbg("\r\n");
}
while(true);
}


串口打印的数据如下
AT24CXX Example
Read @0x00: 0x00
Read @0x01: 0x01
Read @0x02: 0x02
Read @0x03: 0x03
Read @0x04: 0x04
Read @0x05: 0x05
Read @0x06: 0x06
Read @0x07: 0x07
Read @0x08: 0x08
Read @0x09: 0x09
Read @0x0A: 0x0A
Read @0x0B: 0x0B
Read @0x0C: 0x0C
Read @0x0D: 0x0D
Read @0x0E: 0x0E
Read @0x0F: 0x0F
Read @0x10: 0x10
Read @0x11: 0x11
Read @0x12: 0x12

跟踪进去,返回值也是seccuss,但数据明显不对。搞了两天没解决,请傻孩子、火腿等高手来看看。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入4汤圆

 楼主| 发表于 2012-4-3 09:59:14 | 显示全部楼层
改用at24cxx_read_continuous(0, 0x13, ds)读取从0-0x12共13个字节,得到
[0x00:0x00] [0x01:0x00] [0x02:0x00] [0x03:0x01] [0x04:0x01] [0x05:0x01] [0x06:0x00] [0x07:0x7D] [0x08:0x27] [0x09:0xDE] [0x0A:0xFF] [0x0B:0xFF] [0x0C:0xB3] [0x0D:0xFB] [0x0E:0x1C] [0x0F:0x8A] [0x10:0x00] [0x11:0x1A] [0x12:0x40]
看0x0E和0x0F的内容,应该是读对了,但是时钟却不走,搞不懂
这ASF也忒难用了,直接用口线模拟早就搞定了。

出0入4汤圆

 楼主| 发表于 2012-4-3 09:59:57 | 显示全部楼层
写也写不进去

at24cxx_write_byte(0x0e, 0x04);
  at24cxx_write_byte(0x0f, 0x00);
  ds[0]=0x05;
  ds[1]=0x05;
  ds[2]=0x05;
  ds[3]=0x05;
  ds[4]=0x05;
  ds[5]=0x05;
  ds[6]=0x05;
  
  at24cxx_write_continuous(0x07, 7, ds);

无效

出0入4汤圆

 楼主| 发表于 2012-4-4 09:43:35 | 显示全部楼层
在DS3231上并了一个24C32,读数据正确,并24C08,读出的数据不对

用at24cxx_write_continuous(0, 38, ds)写数据,地址00,01被清零,其他字节不变

程序没有改动。

我真是头大,这ASF到底是有bug还是俺不会用

出0入4汤圆

 楼主| 发表于 2012-4-4 10:24:21 | 显示全部楼层
本帖最后由 liuqian 于 2012-4-4 10:26 编辑

at24cxx.c中的程序

void at24cxx_write_byte(uint16_t byte_address, uint8_t byte_value) {
  uint8_t pack[3];
  twi_package_t twi_package;

  pack[0] = (byte_address&0xFF00)>>8;
  pack[1] = byte_address&0xFF;
  pack[2] = byte_value;

  twi_package.chip = AT24CXX_TWI_ADDRESS;
  twi_package.addr_length = 1;      <<<<<======不一样???
  twi_package.buffer = &pack;
  twi_package.length = sizeof(pack);

  while(twi_master_write(AT24CXX_TWI, &twi_package)!=TWI_SUCCESS);

  return;
}


void at24cxx_write_continuous(uint16_t start_address, uint16_t length, uint8_t const *wr_buffer) {
  uint8_t *pack = {0};
  twi_package_t twi_package;

  pack[0] = (start_address&0xFF00)>>8;
  pack[1] = start_address&0xFF;
  uint16_t idx;
  for (idx=0;idx<length;idx++)
    pack[2+idx] = wr_buffer[idx];

  twi_package.chip = AT24CXX_TWI_ADDRESS;
  twi_package.addr_length = 0;           <<<<<===== 不一样???
  twi_package.buffer = &pack;
  twi_package.length = sizeof(pack);

  while(twi_master_write(AT24CXX_TWI, &twi_package)!=TWI_SUCCESS);

  return;
}


uint8_t at24cxx_read_byte(uint16_t byte_address) {
uint8_t data;
  twi_package_t twi_package;

  twi_package.chip = AT24CXX_TWI_ADDRESS;
  twi_package.addr_length = 0;
  twi_package.buffer = &byte_address;
  twi_package.length = 2;
  while(twi_master_write(AT24CXX_TWI, &twi_package)!=TWI_SUCCESS);

  twi_package.chip = AT24CXX_TWI_ADDRESS;
  twi_package.addr_length = 0;
  twi_package.buffer = &data;
  twi_package.length = 1;
  while(twi_master_read(AT24CXX_TWI, &twi_package)!=TWI_SUCCESS);


  return data;

}


void at24cxx_read_continuous(uint16_t start_address, uint16_t length, uint8_t *rd_buffer) {
  twi_package_t twi_package;

  twi_package.chip = AT24CXX_TWI_ADDRESS;
  twi_package.addr_length = 0;
  twi_package.buffer = &start_address;
  twi_package.length = 2;
  while(twi_master_write(AT24CXX_TWI, &twi_package)!=TWI_SUCCESS);

  twi_package.chip = AT24CXX_TWI_ADDRESS;
  twi_package.addr_length = 0;
  twi_package.buffer = rd_buffer;
  twi_package.length = length;
  while(twi_master_read(AT24CXX_TWI, &twi_package)!=TWI_SUCCESS);

}


不明白 twi_package.addr_length 是干什么用的

出0入4汤圆

 楼主| 发表于 2012-4-4 14:37:59 | 显示全部楼层
终于搞定了。
AT24CXX用了双字节地址,改为单字节地址终于OK。
把TWIM和24CXX代码一行一行的仔细看了一遍,一边看一边写注释,终于了解了TWIM的设定和工作方式。这ASF为了多种CPU的兼容性和框架结构,搞的太复杂。
但是上面那个帖子提到的 twi_package.addr_length,还是没搞明白。

出0入0汤圆

发表于 2014-11-8 22:32:38 | 显示全部楼层
谢谢分享!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 04:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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