1. 刚开始的波形不太对,比如如下代码

        i2c_status = I2C_write( at24c02_write_buf,          //pointer to data array
                                1,                //length of data to be transmitted
                                1,                //master or slaver
                                0x78,        //slave address to transmit to
                                1,                //transfer mode of operation
                                30000            //time out for bus busy
                                );

但是实际的波形是,把0x78左移了一位,我估计是DSP5509会自动在最后一位加上读写位

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

TMS320VC5509驱动AT24C02 随笔 第1张

所以本次AT24C02的地址是0XA0,那么实际写的应该是0x50

        i2c_status = I2C_write( at24c02_write_buf,          //pointer to data array
                                1,                //length of data to be transmitted
                                1,                //master or slaver
                                0x50,        //slave address to transmit to
                                1,                //transfer mode of operation
                                30000            //time out for bus busy
                                );

2. 最后的综合代码如下

#include <csl.h> #include <csl_i2c.h> #include <stdio.h> #include <csl_pll.h> #include <csl_gpio.h>


#define BUF_LEN 20
#define AT24C02_WRITE_ADDR  0x50
#define AT24C02_READ_ADDR  0X50 Uint16 i2c_status; /*锁相环的设置*/ PLL_Config myConfig = { 0,    //IAI: the PLL locks using the same process that was underway //before the idle mode was entered
  1,    //IOB: If the PLL indicates a break in the phase lock, //it switches to its bypass mode and restarts the PLL phase-locking //sequence
  12,    //PLL multiply value; multiply 24 times
  1             //Divide by 2 PLL divide value; it can be either PLL divide value //(when PLL is enabled), or Bypass-mode divide value //(PLL in bypass mode, if PLL multiply value is set to 1)
}; /* This next struct shows how to use the I2C API */
/* Create and initialize an I2C initialization structure */ I2C_Setup I2Cinit = { 0,              /* 7 bit address mode */
        0,         /* own address - don't care if master */
        30,            /* clkout value (Mhz) */
        50,            /* a number between 10 and 400*/
        0,              /* number of bits/byte to be received or transmitted (8)*/
        0,              /* DLB mode on*/
        1               /* FREE mode of operation on*/ }; Uint16 at24c02_write_buf[3] ={0x00,0x00,0x00}; Uint16 test_write_buf[BUF_LEN+1] = {0}; I2C_Config testI2C; void delay(Uint32 k) { while(k--); } void main(void) { unsigned char i= 0; i2c_status = 1; /*初始化CSL库*/ CSL_init(); /*设置系统的运行速度为140MHz*/ PLL_config(&myConfig); /*确定方向为输出*/ GPIO_RSET(IODIR,0xFF); GPIO_RSET(IODATA,0x00); /*I2C is undet reset*/ I2C_RSET(I2CMDR,0); /*设置预分频寄存器,I2C的mode clock is 10MHz*/ delay(100); I2C_RSET(I2CSAR,0x001A); I2C_RSET(I2CMDR,0x0620); I2C_setup(&I2Cinit); /*设置I2C的Mater clock*/ I2C_RSET(I2CCLKL,100); I2C_RSET(I2CCLKH,100); I2C_getConfig(&testI2C); //     for(i=0;i<BUF_LEN;i++) { at24c02_write_buf[0] = i; at24c02_write_buf[1] = 5+i; i2c_status = I2C_write( at24c02_write_buf,          //pointer to data array
                                2,                //length of data to be transmitted
                                1,                //master or slaver
                                AT24C02_WRITE_ADDR,        //slave address to transmit to
                                1,                //transfer mode of operation
                                30000            //time out for bus busy
 ); delay(100); } for(i=0;i<BUF_LEN;i++) { at24c02_write_buf[0] = i; at24c02_write_buf[1] = 0; test_write_buf[i] = 0; i2c_status = I2C_write( at24c02_write_buf,          //pointer to data array
                                1,                //length of data to be transmitted
                                1,                //master or slaver
                                AT24C02_WRITE_ADDR,        //slave address to transmit to
                                1,                //transfer mode of operation
                                30000            //time out for bus busy
 ); i2c_status = I2C_read( &(test_write_buf[i]),          //pointer to data array
                                1,                //length of data to be transmitted
                                1,                //master or slaver
                                AT24C02_READ_ADDR,        //slave address to transmit to
                                1,                //transfer mode of operation
                                30000,            //time out for bus busy
                                0 ); delay(1000); } while(1); }

3. 看下仿真的结果

TMS320VC5509驱动AT24C02 随笔 第2张

4. 看下写数据的波形

TMS320VC5509驱动AT24C02 随笔 第3张

读数据的波形

TMS320VC5509驱动AT24C02 随笔 第4张

TMS320VC5509驱动AT24C02 随笔 第5张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄