📄 tms470r1b1m_i2c_01.c
字号:
//******************************************************************************
// TMS470 Demo - I2C Sample Program I2C1 to I2C2
//
// This is a I2C1 to I2C2 Interrupt configuration.
// Data from a table is transmitted from I2C1 based on the RTI timing. Data
// is received on I2C2 and then the leds are lit to reflect the I2C data.
// Clock speed is 60 MHz. Data size is 8 bits. These signals are connected on
// the same board.
//
//
// TMS-FET470B1M
// _________________
// | |
// /|\| OSCIN|-
// | | | 7.5MHz
// --|PLLDIS OSCOUT|-
// | |
// |----- I2C1 ------|
// | SCL |---
// | |
// | SDA |---
// | |
// |----- I2C2 ------|
// | SCL |---
// | |
// | SDA |---
// |_________________|
//
//
//
//
// J. Mangino / A. Dannenberg
// Texas Instruments, Inc
// January 2006
// Built with IAR Embedded Workbench Version: 4.30A
//******************************************************************************
#include <intrinsic.h>
#include "iotms470r1b1m.h"
#include "tms470r1b1m_bit_definitions.h"
// LED moving pattern codes.
const int led_table[] = {
0x0000,0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0xffff
};
unsigned int datp;
const int* ip;
void TMS470LedSet(unsigned int mask)
{
GIODOUTE = mask & 0xFF;
HETDOUT = (mask & 0xFF00)>>8;
}
void COMP1_irq_handler()
{
RTICINT &= ~CMP1FLAG; // interrupt control, clear CMP1
if (*ip != 0xffff)
{
I2C1MDR |= MST;
I2C1MDR |= STT+STP+TRX;
I2C1DXR = *ip;
ip++;
}
else
{
ip = led_table;
I2C1MDR |= MST;
I2C1MDR |= STT+STP+TRX;
I2C1DXR = *ip;
ip++;
}
}
void I2C2_irq_handler()
{
datp = I2C2DRR&0XFF;
TMS470LedSet(datp);
}
//------------------------------------------------------------------------------
// TMS470R1B1M Standard Interrupt Handler
//------------------------------------------------------------------------------
__irq __arm void irq_handler(void)
{
switch((0xff & IRQIVEC)-1)
{
case CIM_COMP1 : COMP1_irq_handler(); break;
case CIM_I2C2 : I2C2_irq_handler(); break;
}
}
void main(void)
{
// Set up peripheral registers.
// First disable interrupts.
__disable_interrupt();
ip = led_table;
// Setup system.
PCR = CLKDIV_2; // ICLK = SYSCLK/2
PCR |= PENABLE; // enable peripherals
GCR = ZPLL_CLK_DIV_PRE_1; // SYSCLK = 8 x fOSC
REQMASK = (1 << CIM_COMP1) + (1 << CIM_I2C2); // Enable I2C Interrupt mask
// Setup periodic interrupt using RTI with RTICMP1
RTICNTEN = CNTEN_NOCNT; // Stop counting
RTICNTR = 0x00; // clear 21-bits CNTR
// Setup periodic interrupt timer
// CMP1 used to generate interrupt.
RTIPCTL = 0x3; // preload 11-bits MOD
RTICMP1 = 0xfffff; //
RTICNTL = 0x00; // clear and disable tap
// interrupt control, clear CMP1 and enable CMP1 interrupt
RTICINT = 0x00;
RTICINT |= CMP1ENA;
// Start count, CNTR and MOD will count in both USER and SYSTEM mode
RTICNTEN = CNTEN_UP;
HETDIR = 0xff; // Set HET as GIO outputs
HETDOUT = 0xff; // Output on
HETDOUT = 0x00; // Output off
HETDOUT = 0xff; // Output on
GIODIRE = 0xff; // Set GIO outputs
GIODOUTE = 0xff; // Output on
//I2C 1 Set up
I2C1PSC = 2; // Module clock frequency
// I2CCLK = ICLK / (PSC + 1)
// I2CCLK = 10 MHz
I2C1CKL = 38; // Low clock period
I2C1CKH = 38; // High clock period
I2C1OAR = 0x56; // Set address 0x56
I2C1IMR = 0x0; // Interrupts disabled
I2C1CNT = 1; // Set count = 1
I2C1SAR = 0x48; // Set address 0x48
I2C1PFNC = 0;
I2C1DIR = SDAFUNC+SCLFUNC; // Set I2C Functions
I2C1MDR |= NIRS; // Clear reset
//I2C 2 Set up
I2C2PSC = 2; // Module clock frequency
// I2CCLK = ICLK / (PSC + 1)
// I2CCLK = 10 MHz
I2C2CKL = 38; // Low clock period
I2C2CKH = 38; // High clock period
I2C2OAR = 0x48; // Set address 0x48
I2C2IMR = 0x08; // Interrupts receive enabled
I2C2CNT = 1; // Set count = 1
I2C2SAR = 0x56; // Set address 0x56
I2C2PFNC = 0;
I2C2DIR = SDAFUNC+SCLFUNC; // Set I2C Functions
I2C2MDR |= NIRS; // Clear reset
__enable_interrupt(); // Enable Interrupts
// Loop forever.
while (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -