内容发布更新时间 : 2024/11/15 1:13:05星期一 下面是文章的全部内容请认真阅读。
实用文档
图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; //设为发送数据忙状态 }
文案大全