Hi
i am working with freescale sensor starter kit which contains accelerometer, pressure sensor and touch sensor. When i connected to computer through USB it was working fine i.e it got detected and GUI opened and worked on that. Now i dumped MMA8451 accelerometer code which i got in freescale s site
( AN4076SW). But now my device not getting detected. It showing erroe as "Please plug in hw". Now i want to dump the default binary file for which it was working before. I searched in freesacles site but i didnt get any bainry file for that, and i didnt get any CD while purchasing that kit. So please can anyone help me to find binary file for that..
Thanks and Regards
CK
已解决! 转到解答。
Chethan,
If you overwrote the original firmware on the MC9S08QE8 MCU bridge, the board is no longer recognized by Sensor Toolbox PC Software (STB GUI) because the bootloader section was removed by the AN4076SW.
You have to load e.g. the MMA8450Bootloader.s19 file (from C:\Program Files\Freescale\Sensor Toolbox\Bootloaders) into the MC9S08QE8, then power cycle the board, press the green button (Start or F5) and run the STB GUI. Then the STB GUI will take advantage of the bootloader to upload appropriate bridge firmware code.
In the attached file you will find instructions how to program the MC9S08QE8 MCU with the MMA8450Bootloader.s19 file.
Regards,
Tomas
Chethan,
If you overwrote the original firmware on the MC9S08QE8 MCU bridge, the board is no longer recognized by Sensor Toolbox PC Software (STB GUI) because the bootloader section was removed by the AN4076SW.
You have to load e.g. the MMA8450Bootloader.s19 file (from C:\Program Files\Freescale\Sensor Toolbox\Bootloaders) into the MC9S08QE8, then power cycle the board, press the green button (Start or F5) and run the STB GUI. Then the STB GUI will take advantage of the bootloader to upload appropriate bridge firmware code.
In the attached file you will find instructions how to program the MC9S08QE8 MCU with the MMA8450Bootloader.s19 file.
Regards,
Tomas
Hi Tomas
i am working with freescale sensor starter kit LFSTBEB845X which contains MC9S08QE8CWL controller. I connected to PC through USB and my device is not getting detected. It showing error as "Please plug in hw". So now i dumped the default binary file which you provided to me and followed the same steps as mentioned in the attached PDF. When i load the .s19 file to the board i am getting error.. Error is " Could not erase the file.. Flashing failed.. What might be the issue?.. Its too urgent for me.. Hope you will help.
Thanks and Regards,
Chethan
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)
{
POLL_ACTIVE = TRUE; |
}
}
/*********************************************************\
* 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";
Hi Chethan,
First, sorry for the late response, but I have been out of the office the last couple of days.
Did you follow precisely the instructions given in the attached file?
Again: You need to run hiwave.exe program to flash the .s19 file and make sure to select the 9S08QE8 device and 36kHz custom trim frequency. It is key to select proper device and trim its reference frequency as the later plays a part in UART baud rate.
I hope it helps.
Regards,
Tomas
Hi Thomas,
Thank you for the reply... I flashed my board with code which i obtained from AN4076SW.zip file. and now board is not getting detected? What might be the issue? And second question is i checked I2C lines of MMA8451Q sensor using Logic Analyser and I2C lines are blank. Nothing transmission Taking place? What might be issue?
Thanks and regards
Chethan
Hi Chethan,
1. I flashed my board with code which i obtained from AN4076SW.zip file. and now board is not getting detected? What might be the issue?
>> As I wrote before, once you overwrite the original firmware by the AN4076SW, the board is no longer recognized by Sensor Toolbox PC Software (STB GUI) until the bootloader is recovered.
2. And second question is i checked I2C lines of MMA8451Q sensor using Logic Analyser and I2C lines are blank. Nothing transmission Taking place? What might be issue?
>> Did you follow all instructions given in the attached file? What commands are you using to communicate with the MMA8451Q?
Regards,
Tomas