在调试的过程中遇到一些问题,我程序写的是只发一帧,循环发。一旦写进数据寄存器我就产生开始条件,进行传输。等待到结束标志信号后,我就重新发。示波器显示的scl为9个时钟,但是无论我数据传的是什么,sda显示的都不变,不知道为什么啊。主机是DSP,从机的地址为0x90;
选的是七位地址模式(好像是利用七位地址模式不行)还有就是例程中在发送时,先往I2CDXR发送两字节地址,再接着发送四字节数据后才配置I2CMDR。个人理解是否应一个一个的发数据,在每一帧发送数据的时候找好对应的标志位,因为发送寄存器是只有一个的,一次写那么多,怎么发呢?我把我写的程序放上去,麻烦知道看看,不要说给你个官方,因为我看了例程,没看懂。
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
// Note: I2C Macros used in this example can be found in the
// DSP2833x_I2C_defines.h file
// Prototype statements for functions found within this file.
void I2CA_Init(void);
void I2CA_WriteData(Uint16 data);//写数据
#define I2C_SLAVE_ADDR 0x91//从地址
#define I2C_NUMBYTES 4//传输字节数
#define I2C_EEPROM_HIGH_ADDR 0x00//高位地址
#define I2C_EEPROM_LOW_ADDR 0x30//低位地址
void main(void)
{
Uint16 i;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
InitSysCtrl();
// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();
// Setup only the GP I/O only for I2C functionality
InitI2CGpio();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
InitPieVectTable();
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
EALLOW; // This is needed to write to EALLOW protected registers
// PieVectTable.I2CINT1A = &i2c_int1a_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
I2CA_Init();
// Enable interrupts required for this example
// Enable I2C interrupt 1 in the PIE: Group 8 interrupt 1
PieCtrlRegs.PIEIER8.bit.INTx1 = 1;
// Enable CPU INT8 which is connected to PIE group 8
// IER |= M_INT8;
EINT;
I2CA_WriteData(0x0000);
} // end of main
void I2CA_Init(void)
{
// Initialize I2C
I2caRegs.I2CMDR.bit.IRS = 0;
I2caRegs.I2CSAR = 0x0090; // Slave address - EEPROM control code
#if (CPU_FRQ_150MHZ) // Default - For 150MHz SYSCLKOUT
I2caRegs.I2CPSC.all = 14; // Prescaler - need 7-12 Mhz on module clk (150/15 = 10MHz)
#endif
#if (CPU_FRQ_100MHZ) // For 100 MHz SYSCLKOUT
I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk (100/10 = 10MHz)
#endif
I2caRegs.I2CCLKL = 45; // NOTE: must be non zero
I2caRegs.I2CCLKH = 45; // NOTE: must be non zero
I2caRegs.I2CIER.all = 0x24; // Enable SCD & ARDY interrupts
I2caRegs.I2CMDR.all = 0x0020; // Take I2C out of reset
// Stop I2C when suspended
// I2caRegs.I2CSTR.bit.ARDY=1;
// I2caRegs.I2CFFTX.all = 0x6000; // Enable FIFO mode and TXFIFO
// I2caRegs.I2CFFRX.all = 0x2040; // Enable RXFIFO, clear RXFFINT,
}
void I2CA_WriteData(Uint16 data)
{
char Busy_flag;
Busy_flag = I2caRegs.I2CSTR.bit.BB;//判断总线是否忙
if(!Busy_flag)
{
// I2caRegs.I2CSAR = 0xF0;
I2caRegs.I2CSAR = 0x90;
I2caRegs.I2CCNT = 1;
I2caRegs.I2CDXR = data;
while(I2caRegs.I2CSTR.bit.XRDY==0)
I2caRegs.I2CMDR.all = 0x6E20;
// while(I2caRegs.I2CSTR.bit.XRDY==1)
// I2caRegs.I2CDXR = data;
if(I2caRegs.I2CSTR.bit.SCD==0)
for(;;);
if(I2caRegs.I2CSTR.bit.SCD==1)
I2CA_WriteData(0x00);
}
}
|