Hi Tomas,
Sorry for the late reply. I followed those steps given in document. But nothing gets displayed on hyperterminal. And I2c lines are also blank whrn i observed it through logic analyser. I am using same commands which has been given in MMA8451Q document to read WHO_AM_I register and other registers.
And while debugging, a window called True-Time Simulator & Real-Time Debugger will appear. My question is in source window is it necessary that main.c file only should appear? Because in my case Start08.c file is appeared? Is there anything we need to change?
Thanks and regards
Chethan
Here is my code:
In this SlaveAddressIIC = MMA845x_IIC_ADDRESS = 0x1C
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "system.h"
extern void _Startup(void); // External startup function declared in file Start08.c
void MCU_Init(void);
/***********************************************************************************************\
* Private memory declarations
\***********************************************************************************************/
/***********************************************************************************************\
* Public memory declarations
\***********************************************************************************************/
#pragma DATA_SEG __SHORT_SEG _DATA_ZEROPAGE
BIT_FIELD SystemFlag; // system control flags
extern BIT_FIELD StreamMode; // stream mode control flags
byte SlaveAddressIIC; // accelerometer slave I2C address
byte functional_block; // accelerometer function
byte value[6]; // working value result scratchpad
BIT_FIELD RegisterFlag; // temporary accelerometer register variable
byte full_scale; // current accelerometer full scale setting
int deviceID;
byte address_in[3]; // Data Flash input address pointer
byte address_out[3]; // Data Flash output address pointer
#pragma DATA_SEG DEFAULT
tfifo_sample fifo_data[FIFO_BUFFER_SIZE]; // FIFO sample buffer
/***********************************************************************************************\
* Public functions
\***********************************************************************************************/
#pragma MESSAGE DISABLE C1420 /* Warning C1420: Result of function-call is ignored */
/*********************************************************\
* Main Control Loop
\*********************************************************/
void main(void)
{
SCISendString ("started pgmng ");
MCU_Init();
/*
** Initialize system variables.
*/
SystemFlag.Byte = 0;
SCIControlInit();
/*
** Wait for user input before proceeding.
*/
SCI_CharIn();
SCI_INPUT_READY = 0;
EnableInterrupts;
/*
** Initiate terminal interface.
*/
TerminalInit();
/*
** Verify IIC communications with the accelerometer
*/
SlaveAddressIIC = MMA845x_IIC_ADDRESS;
if (SA0_PIN == 1)
{
SlaveAddressIIC += 2;
}
/*
** Brute force delay for about 5ms
*/
for (value[0]=0x10; value[0]!=0; value[0]--)
{
for (value[1]=0xFF; value[1]!=0; value[1]--) {}
}
/*
** Identify the accelerometer
*/
value[0] = IIC_RegRead(SlaveAddressIIC, WHO_AM_I_REG);
if (value[0] == MMA8451Q_ID)
{
SCISendString ("MMA8451Q: ");
deviceID=1;
OSMode_Normal=TRUE;
}
else if (value[0] == MMA8452Q_ID)
{
SCISendString ("MMA8452Q: ");
deviceID=2;
}
else if (value[0] == MMA8453Q_ID)
{
SCISendString ("MMA8453Q: ");
deviceID=3;
}
else
{
SCISendString ("not identified");
for(;;) {};
}
/*
** MMA845x recognized
** Initialize it for 2g operation with an ODR of 200Hz.
*/
MMA845x_Init();
MMA845x_Active();
full_scale= FULL_SCALE_2G;
/*
** Output current status of the accelerometer
*/
Print_ODR_HP();
SCI_putCRLF();
/**********************************************************************************************
** Enter the main control loop.
*/
for(;;)
{
__RESET_WATCHDOG();
/*
** Go process terminal input
*/
ProcessTerminal();
/*
** Determine if any sensor registers need to be polled
*/
if (POLL_ACTIVE == TRUE)
{
switch (functional_block)
{
/////////////////////////////////////////////////////////////////////////////////////////
case FBID_FULL_XYZ_SAMPLE:
/*
** FULL XYZ Sample Registers 0x01-0x06 (MMA8451Q=14 bit, MMA8452Q= 12 bit, MMA8453Q= 10 bit
**
** Poll ZYXDR bit in Status Register
*/
RegisterFlag.Byte = IIC_RegRead(SlaveAddressIIC, STATUS_00_REG);
if (RegisterFlag.ZYXDR_BIT == 1)
{
/*
** Read the XYZ sample data
*/
if (deviceID>3)
{
IIC_RegReadN(SlaveAddressIIC, OUT_X_MSB_REG, 3, &value[0]);
}
else
{
IIC_RegReadN(SlaveAddressIIC, OUT_X_MSB_REG, 6, &value[0]);
}
/*
** Output results
*/
OutputTerminal (FBID_FULL_XYZ_SAMPLE, &value[0]);
}
break;
/////////////////////////////////////////////////////////////////////////////////////////
case FBID_FIFO:
/*
** FIFO
**
** Read the FIFO Status Register (0x00) and then read the 12-bit FIFO Data (0x12)
*/
RegisterFlag.Byte = IIC_RegRead(SlaveAddressIIC, F_STATUS_REG);
/*
** Go read FIFO with a single multi-byte IIC access
*/
value[4] = (RegisterFlag.Byte & F_CNT_MASK) * 6;
IIC_RegReadN(SlaveAddressIIC, OUT_X_MSB_REG, value[4], &fifo_data[0].Sample.XYZ.x_msb);
OutputTerminal (FBID_FIFO, &fifo_data[0].Sample.XYZ.x_msb);
break;
/////////////////////////////////////////////////////////////////////////////////////////
default:
break;
}
if ((INT_STREAM == TRUE))
{
POLL_ACTIVE = FALSE;
}
}
}
}
/*********************************************************\
* Power-on Reset Entry Point
\*********************************************************/
#pragma NO_FRAME
#pragma NO_EXIT
void _EntryPoint(void)
//void MCU_Init(void)
{
/*
** Initialize General System Control
*/
SOPT1 = init_SOPT1; // System Options Register 1
SOPT2 = init_SOPT2; // System Options Register 2
SPMSC1 = init_SPMSC1; // System Power Management Status and Control 1 Register
SPMSC2 = init_SPMSC2; // System Power Management Status and Control 2 Register
SPMSC3 = init_SPMSC3; // System Power Manag
| SCGC1 = init_SCGC1; | // System Clock Gating Control 1 Register |
| SCGC2 = init_SCGC2; | // System Clock Gating Control 2 Register |
/*
** Initialize Internal Clock Source
*/
| ICSTRM = NVICSTRM; | // ICS Trim Register |
| ICSSC = NVICSTRM; | // ICS Fine Trim |
| ICSC1 = init_ICSC1; | // ICS Control Register 1 |
| ICSC2 = init_ICSC2; | // ICS Control Register 2 |
| while(!ICSSC_IREFST) {} | // Wait until source of reference clock is internal clock |
| ICSSC = init_ICSSC; | // ICS Status and Control |
| while((ICSSC & 0xC0) != 0x00) {} | // Wait until the FLL switches to Low range DCO mode |
/*
** Initialize Port I/O
*/
| PTAD = init_PTAD; | // Port A Data Register |
| PTAPE = init_PTAPE; | // Port A Pull Enable Register |
| PTASE = init_PTASE; | // Port A Slew Rate Enable Register |
| PTADS = init_PTADS; | // Port A Drive Strength Selection Register |
| PTADD = init_PTADD; | // Port A Data Direction Register |
| PTBD = init_PTBD; | // Port B Data Register |
| PTBPE = init_PTBPE; | // Port B Pull Enable Register |
| PTBSE = init_PTBSE; | // Port B Slew Rate Enable Register |
| PTBDS = init_PTBDS; | // Port B Drive Strength Selection Register |
| PTBDD = init_PTBDD; | // Port B Data Direction Register |
| PTCD = init_PTCD; | // Port C Data Register |
| PTCPE = init_PTCPE; | // Port C Pull Enable Register |
| PTCSE = init_PTCSE; | // Port C Slew Rate Enable Register |
| PTCDS = init_PTCDS; | // Port C Drive Strength Selection Register |
| PTCDD = init_PTCDD; | // Port C Data Direction Register |
| PTDD = init_PTDD; | // Port D Data Register |
| PTDPE = init_PTDPE; | // Port D Pull Enable Register |
| PTDSE = init_PTDSE; | // Port D Slew Rate Enable Register |
| PTDDS = init_PTDDS; | // Port D Drive Strength Selection Register |
| PTDDD = init_PTDDD; | // Port D Data Direction Register |
/*
** Initialize Interrupt Pins (IRQ and KBI)
*/
| IRQSC = init_IRQSC; | // Interrupt Pin Request Status and Control Register |
| KBISC = init_KBISC; | // KBI Interrupt Status and Control Register |
| KBIPE = init_KBIPE; | // KBI Interrupt Pin Select Register |
| KBIES = init_KBIES; | // KBI Interrupt Edge Select Register |
/*
** Initialize Inter-Integrated Circuit (IIC)
*/
| IICF = init_IICF; | // IIC Frequency Divider Register |
| IICC1 = init_IICC1; | // IIC Control Register 1 |
/*
** Initialize Serial Communications Interface (SCI)
*/
| SCIBDH = init_SCIBDH; | // SCI Baud Rate Register High |
| SCIBDL = init_SCIBDL; | // SCI Baud Rate Register Low |
| SCIC1 = init_SCIC1; | // SCI Control Register 1 |
| SCIC2 = init_SCIC2; | // SCI Control Register 2 |
| SCIC3 = init_SCIC3; | // SCI Control Register 3 |
/*
** Initialize Serial Peripheral Interface (SPI)
*/
| SPIBR = init_SPIBR; | // SPI Baud Rate Register |
| SPIC2 = init_SPIC2; | // SPI Control Register 2 |
| SPIC1 = init_SPIC1; | // SPI Control Register 1 |
/*
** Perform ANSI startup and jump into main control
*/
| __asm jmp _Startup; | // Jump to C startup code |
}
/*********************************************************\
** Activate sensor interrupts
\*********************************************************/
void InterruptsActive (byte ctrl_reg3, byte ctrl_reg4, byte ctrl_reg5)
{
MMA845x_Standby();
IIC_RegWrite(SlaveAddressIIC, CTRL_REG3, (IIC_RegRead(SlaveAddressIIC, CTRL_REG3) | ctrl_reg3));
IIC_RegWrite(SlaveAddressIIC, CTRL_REG4, ctrl_reg4);
IIC_RegWrite(SlaveAddressIIC, CTRL_REG5, ctrl_reg5);
MMA845x_Active();
/*
** Enable keyboard interrupts
*/
CLEAR_KBI_INTERRUPT;
INT_PINS_ENABLED;
}
/*********************************************************\
* Keyboard Interrupt Service Routine
\*********************************************************/
interrupt void isr_KBI (void)
{
/*
** Clear the interrupt flag
*/
CLEAR_KBI_INTERRUPT;
/*
** Go read the Interrupt Source Register
*/
RegisterFlag.Byte = IIC_RegRead(SlaveAddressIIC, INT_SOURCE_REG);
if (RegisterFlag.SRC_DRDY_BIT == 1)
{
| /* |
| ** Enable polling of the data - once. |
| */ |
| POLL_ACTIVE = TRUE; |
}
if (RegisterFlag.SRC_FIFO_BIT == 1)
{
}
}
/*********************************************************\
* Dummy Interrupt Service Routine
\*********************************************************/
interrupt void DummyIRQ (void)
{
}
| // FUNCTION BODIES //////////////////////////////////////////////////// | |
| //--------------------------------------------------------------------- | |
void MCU_Init(void)
{
| // Crucial | |
| _asm SEI; | // disable interrupts |
| SOPT1=0x23; | // disable COP, enable Stop mode; Reset & Bkgd = BDM |
| SPMSC1=0x00; | // disable LVDSE |
| SPMSC2=0x03; | // enable Stop2 Mode |
// System Clock Init
| ICSTRM=NVICSTRM; | // initialize ICSTRM register from NV_ICSTRM |
| ICSSC =NVFTRIM; | // initialize ICSSC register from NV_FTRIM |
ICSC1=0x04;
| ICSC2=0x00; | // go to full bus speed (/1) instead of /2 |
| ICSSC|=0x80; | // Trim*512=32768Hz*512=16.777MHz (8.388MHz bus) |
// ADC Init
| ADCCFG=0x40; | // 8 bits & 2.09MHz clock (/4) |
// Timer1 Init
| TPM2SC=0x08; | // busclk/1=119ns per count |
| TPM2MOD=839-1; | // 839 * 119ns = 100us period |
// Timer2 Init (Buzzer)
| TPM1SC=0x00; | // busclk/1=119ns per count; buzzer on=0x08, off=0x00 |
| TPM1C1SC=0x28; | // edge-aligned PWM |
| TPM1MOD=19065-1; | // 440Hz by default |
| TPM1C1V=19065>>1; | // half of the above to produce 50% duty cycle PWM |
// GPIO Init
| PTAD=0x00; | // LEDR (PTA0) | |
| PTBD=0x00; | // LEDG (PTB3) and LEDB (PTB4) are off by default |
| PTADD=0x01; | // LEDR (PTA0) |
| PTBDD=0x18; | // LEDG (PTB3) and LEDB (PTB4) are outputs |
| PTBPE=0x04; | // enable pull-ups for nSW4 (PTB2) |
}
//---------------------------------------------------------------------
/***********************************************************************************************\
* Private functions
\***********************************************************************************************/
#pragma CODE_SEG REVISION
const byte Vendor[] @0xFFC0 = "Freescale";