TMS320VC5509驱动AT24C02
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实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。所以本次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. 看下仿真的结果
4. 看下写数据的波形
读数据的波形

更多精彩