DSP28335I2C接口应用 下载本文

实用文档

图4中断函数流程图

4.程序附录

//可以用以下代码替换示例程序Example_280xI2c_eeprom.c中的代码,再进行调试。//

//该程序跟原始程序没多大区别,主要改变为:引入几个统计变量,改变发送数据长度为2字节//

// TI File $Revision: /main/5 $

// Checkin $Date: April 4, 2007 17:18:36 $

//########################################################################### //

// FILE: Example_280xI2c_eeprom.c //

// TITLE: DSP280x I2C EEPROM Example //

// ASSUMPTIONS: //

// This program requires the DSP280x header files. //

// This program requires an external I2C EEPROM connected to // the I2C bus at address 0x50. //

// As supplied, this project is configured for \// operation. The 280x Boot Mode table is shown below. // For information on configuring the boot mode of an eZdsp, // please refer to the documentation included with the eZdsp, //

// Boot GPIO18 GPIO29 GPIO34 // Mode SPICLKA SCITXDA // SCITXB

// ------------------------------------- // Flash 1 1 1 // SCI-A 1 1 0 // SPI-A 1 0 1 // I2C-A 1 0 0 // ECAN-A 0 1 1

// SARAM 0 1 0 <- \// OTP 0 0 1 // I/0 0 0 0 //

// DESCRIPTION: //

// This program will write 1-14 words to EEPROM and read them back. // The data written and the EEPROM address written to are contained // in the message structure, I2cMsgOut1. The data read back will be // contained in the message structure I2cMsgIn1.

文案大全

实用文档

// -------------------------------------------------------------- // CODE MODIFICATIONS ARE REQUIRED FOR 60 MHZ DEVICES (In // DSP280x_Examples.h in the common/include/ directory, set // #define CPU_FRQ_60MHZ to 1, and #define CPU_FRQ_100MHZ to 0). // -------------------------------------------------------------- // This program will work with the on-board I2C EEPROM supplied on // the F280x eZdsp. // //

//########################################################################### // Original Author: D.F. //

// $TI Release: DSP280x Header Files V1.60 $ // $Release Date: December 3, 2007 $

//###########################################################################

#include \#include \

// Note: I2C Macros used in this example can be found in the // DSP280x_I2C_defines.h file

// Prototype statements for functions found within this file. void I2CA_Init(void);

Uint16 I2CA_WriteData(struct I2CMSG *msg); Uint16 I2CA_ReadData(struct I2CMSG *msg); interrupt void i2c_int1a_isr(void); void pass(void); void fail(void);

#define I2C_SLAVE_ADDR 0x50 //EEPROM地址

#define I2C_NUMBYTES 2 //为方便示波器观察,设置发送2字节的数据 #define I2C_EEPROM_HIGH_ADDR 0x11 //数据的写入地址高位 #define I2C_EEPROM_LOW_ADDR 0x0F //数据的写入地址低位

// Global variables//全局变量

// Two bytes will be used for the outgoing address,//有2个字节是地址 // thus only setup 14 bytes maximum//最多只能设置14字节数据

struct I2CMSG I2cMsgOut1={I2C_MSGSTAT_SEND_WITHSTOP,//初始状态为:发送带停止位数据 I2C_SLAVE_ADDR, I2C_NUMBYTES,

I2C_EEPROM_HIGH_ADDR, I2C_EEPROM_LOW_ADDR,

文案大全

实用文档

0xff, // Msg Byte 01 0x3F, // Msg Byte 02 0x56, // Msg Byte 03 0x78, // Msg Byte 04 0x9A, // Msg Byte 05 0xBC, // Msg Byte 06 0xDE, // Msg Byte 07 0xF0, // Msg Byte 08 0x11, // Msg Byte 09 0x10, // Msg Byte 10 0x11, // Msg Byte 11 0x12, // Msg Byte 12 0x13, // Msg Byte 13 0x12, };

struct I2CMSG I2cMsgIn1={ I2C_MSGSTAT_SEND_NOSTOP, I2C_SLAVE_ADDR, I2C_NUMBYTES,

I2C_EEPROM_HIGH_ADDR, I2C_EEPROM_LOW_ADDR};

struct I2CMSG *CurrentMsgPtr; Uint16 PassCount; Uint16 FailCount;

Uint16 ARDY_ISRC_NACK_number=0; //统计ARDY中断源引起的中断中NACK次数 Uint16 SCD_ISRC_number=0; //统计SCD中断源引起的中断次数 Uint16 ARDY_ISRC_number=0; //统计ARDY中断源引起的中断次数 Uint16 all_ISRC_number=0; //统计所有中断源引起的中断次数 Uint16 Write_load_num=0; //统计写数据函数调用次数

Uint16 Read_load_num1=0; //统计读数据函数调用次数1第一步骤 Uint16 Read_load_num2=0; //统计读数据函数调用次数2第二步骤

void main(void) {

Uint16 Error; Uint16 i;

CurrentMsgPtr = &I2cMsgOut1;

// Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks

// This example function is found in the DSP280x_SysCtrl.c file.

// Used in interrupts

// Msg Byte 14

文案大全

实用文档

InitSysCtrl();

// Step 2. Initalize GPIO:

// This example function is found in the DSP280x_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 DSP280x_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 DSP280x_DefaultIsr.c. // This function is found in DSP280x_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 DSP280x_InitPeripherals.c // InitPeripherals(); // Not required for this example I2CA_Init();

// Step 5. User specific code

文案大全

实用文档

// Clear Counters PassCount = 0; FailCount = 0;

// Clear incoming message buffer

for (i = 0; i < I2C_MAX_BUFFER_SIZE; i++) {

I2cMsgIn1.MsgBuffer[i] = 0x0000; }

// 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;

// Application loop for(;;) {

////////////////////////////////// // Write data to EEPROM section // //////////////////////////////////

// Check the outgoing message to see if it should be sent. // In this example it is initialized to send with a stop bit. if(I2cMsgOut1.MsgStatus == I2C_MSGSTAT_SEND_WITHSTOP) { Write_load_num++;

Error = I2CA_WriteData(&I2cMsgOut1);

// If communication is correctly initiated, set msg status to busy//如果通信已经正确初始化,设置msg状态为’忙‘,并

// and update CurrentMsgPtr for the interrupt service routine. //更新作为中断服务路径的指针CurrentMsgPtr。 // Otherwise, do nothing and try again next loop. Once message is //否则,不做任何操作,等待下一次重新写数据。一旦信息正确

// initiated, the I2C interrupts will handle the rest. Search for //初始化,I2C中断将处理接下来的事情。可以在 // ICINTR1A_ISR in the i2c_eeprom_isr.c file. //i2c_eeprom_isr.c文件中找到ICINTR1A_ISR。 if (Error == I2C_SUCCESS) //数据已成功放入缓存寄存器 {

CurrentMsgPtr = &I2cMsgOut1; //改变指针路径 I2cMsgOut1.MsgStatus = I2C_MSGSTAT_WRITE_BUSY; //设为发送数据忙状态 }

文案大全