我在TMS320F28035上搭建了一个I2C的从机,但是,无法实现功能,也没有找到相关的官方例程。如果有人在这方面有过经验,想请您给出点建议,谢谢。我的代码如下:
/*
* main.c
*/
#include "DSP28x_Project.h"
#include "DSP2803x_I2c.h"
#include "DSP2803x_I2c_defines.h"
#include <math.h>
#define I2C_slave_addr 0x08
#define LED_ON GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
#define LED_OFF GpioDataRegs.GPBSET.bit.GPIO34 = 1;
#define LED_BLINK GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
struct I2C_REGS I2c_slave;
int read=0;
int count=0;
void I2C_Slave_Init(void);
int I2C_Slave_read(void);
void I2C_Slave_write(int returnvalue);
int main(void)
{
InitSysCtrl();
InitGpio();
InitI2CGpio();
I2C_Slave_Init();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// InitPeripherals();
while(1)
{
read=I2C_Slave_read();
if (read == 0x0001)
{
LED_OFF;
}
else
{
LED_ON;
}
}
}
void I2C_Slave_Init(void)
{
I2c_slave.I2COAR = 0x0010; // Set Own Adress
I2c_slave.I2CMDR.all = 0x0000;
I2c_slave.I2CPSC.all = 19; // Prescaler – need 7-12 Mhz on module clk
I2c_slave.I2CCLKL = 10; // NOTE: must be non zero
I2c_slave.I2CCLKH = 5; // NOTE: must be non zero
I2c_slave.I2CIER.all = 0x0; // disable SCD & ARDY __interrupts
I2c_slave.I2CFFTX.all = 0x0000; // Enable FIFO mode and TXFIFO
I2c_slave.I2CFFRX.all = 0x0000; // Enable RXFIFO, clear RXFFINT,
I2c_slave.I2CMDR.all = 0x0020; // I2C Slave, Free, release from reset
return;
}
int I2C_Slave_read(void)
{
int i;
I2c_slave.I2CCNT=1;
i = I2c_slave.I2CDRR & 0x00FF;//I2CDRR is a 16 bit register,
return i;
// receivedata[0]=I2c_slave.I2CDRR;
}
void I2C_Slave_write(int returnvalue)
{
}
mangui zhang:slave的例程比较少先确保引脚设计SCL SDA连接正常上拉电阻有设计
实在不行建议抓取波形看看是不是MCU作为slave没有响应还是?
我在TMS320F28035上搭建了一个I2C的从机,但是,无法实现功能,也没有找到相关的官方例程。如果有人在这方面有过经验,想请您给出点建议,谢谢。我的代码如下:
/*
* main.c
*/
#include "DSP28x_Project.h"
#include "DSP2803x_I2c.h"
#include "DSP2803x_I2c_defines.h"
#include <math.h>
#define I2C_slave_addr 0x08
#define LED_ON GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
#define LED_OFF GpioDataRegs.GPBSET.bit.GPIO34 = 1;
#define LED_BLINK GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
struct I2C_REGS I2c_slave;
int read=0;
int count=0;
void I2C_Slave_Init(void);
int I2C_Slave_read(void);
void I2C_Slave_write(int returnvalue);
int main(void)
{
InitSysCtrl();
InitGpio();
InitI2CGpio();
I2C_Slave_Init();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// InitPeripherals();
while(1)
{
read=I2C_Slave_read();
if (read == 0x0001)
{
LED_OFF;
}
else
{
LED_ON;
}
}
}
void I2C_Slave_Init(void)
{
I2c_slave.I2COAR = 0x0010; // Set Own Adress
I2c_slave.I2CMDR.all = 0x0000;
I2c_slave.I2CPSC.all = 19; // Prescaler – need 7-12 Mhz on module clk
I2c_slave.I2CCLKL = 10; // NOTE: must be non zero
I2c_slave.I2CCLKH = 5; // NOTE: must be non zero
I2c_slave.I2CIER.all = 0x0; // disable SCD & ARDY __interrupts
I2c_slave.I2CFFTX.all = 0x0000; // Enable FIFO mode and TXFIFO
I2c_slave.I2CFFRX.all = 0x0000; // Enable RXFIFO, clear RXFFINT,
I2c_slave.I2CMDR.all = 0x0020; // I2C Slave, Free, release from reset
return;
}
int I2C_Slave_read(void)
{
int i;
I2c_slave.I2CCNT=1;
i = I2c_slave.I2CDRR & 0x00FF;//I2CDRR is a 16 bit register,
return i;
// receivedata[0]=I2c_slave.I2CDRR;
}
void I2C_Slave_write(int returnvalue)
{
}
user4915458:
回复 mangui zhang:
是的,没找到比较好的TI例程。我后来测试了一下,可能还是slave一些设置的问题。我的主机在发送地址后,可能是从机无法识别消息,因此没有返回ACK,导致我的主机始终是一种挂起的状态。现在,就是没有很好的方法来确认这个寄存器设置是不是正确的。这就比较头疼了。