?? main_archive.c
字號:
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2007
*
* File name : main.c
* Description : CAN test
*
* History :
* 1. Date : April 28, 2007
* Author : Stanimir Bonev
* Description : Create
*
* $Revision: 1.4 $
**************************************************************************/
// #include <stdio.h>
#include "stm32f10x_lib.h"
#include "arm_comm.h"
#include "lcd.h"
#include "includes.h"
#include "stm32f10x_map.h"
#include "adc.h"
#include "pwm.h"
#include "bits.h"
#include "mmc.h"
#include "test.h"
#include "rtc.h"
#include "nRF24L01.h"
#include "const.h"
#include "i2c.h"
#include "drv_lisxxx.h"
#define MENU_NUMB 8
unsigned char Inversion[] = { 0, 0, 0, 0, 0, 0, 0 };
unsigned char Menu[MENU_NUMB][15] = {
" Test MMC Card\0",
" Test Audio \0",
" Test RTC \0",
" Test NRF \0",
" Test USB \0",
" Test MMA \0",
" Test Port \0",
" Test Joystick\0"
// " \0",
// " \0",
// "www.olimex.com\0"
};
#define KEY_NONE 0
#define KEY_UP 1
#define KEY_DOWN 2
#define KEY_LEFT 3
#define KEY_RIGHT 4
#define KEY_CENTER 5
#define UP_VALUE 960
#define DOWN_VALUE 190
#define LEFT_VALUE 1990
#define RIGHT_VALUE 470
#define DIVERSION 30
// const static unsigned short SinTable[8] = { 0x07FF, 0x0DA7, 0x0FFF, 0x0DA7, 0x07FF, 0x0257, 0x0000, 0x0257 };
__root __no_init volatile CAN_TypeDef ttt @ CAN_BASE;
__root __no_init volatile RCC_TypeDef ttt1 @ RCC_BASE;
__root __no_init volatile GPIO_TypeDef ttt2 @ GPIOB_BASE;
__root __no_init volatile AFIO_TypeDef ttt3 @ AFIO_BASE;
__root __no_init volatile I2C_TypeDef ttt4 @ I2C1_BASE;
__root __no_init volatile RTC_TypeDef RTC_ttt @ RTC_BASE;
unsigned char ch=0, index=0, but1_flag=0, but2_flag=0, offset, menu_flag=0;
unsigned char config, status_temp, payload;
extern unsigned char status;
extern GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
signed char new_pos=0, cur_pos=-1;
volatile unsigned int dly;
unsigned char JoyPos;
unsigned char MenuPos;
Int16U ADCValue;
unsigned char jjj=0;
unsigned char test_state=0;
void Delay_ (unsigned long a) { while (--a!=0); }
/*************************************************************************
* Function Name: InitJoystick
* Parameters: none
* Return: none
*
* Description: Init joystick position
*
*************************************************************************/
void InitJoystick(void) {
// Set variables asociates
JoyPos = 0;
MenuPos = 1;
// Init
ADCInit();
// BUTTON CENTER as input
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// B1 as input
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*************************************************************************
* Function Name: GetJoystickPosition
* Parameters: none
* Return: Joistick position
*
* Description: Measure ADC and return joystick position
*
*************************************************************************/
unsigned char GetJoystickPosition (void) {
ADCValue = GetADCChanel(ADC_Channel_15);
if( (ADCValue>(UP_VALUE-DIVERSION))&&(ADCValue<(UP_VALUE+DIVERSION)) ) { return KEY_UP; }
if( (ADCValue>(DOWN_VALUE-DIVERSION))&&(ADCValue<(DOWN_VALUE+DIVERSION)) ) { return KEY_DOWN; }
if( (ADCValue>(LEFT_VALUE-DIVERSION))&&(ADCValue<(LEFT_VALUE+DIVERSION)) ) { return KEY_LEFT; }
if( (ADCValue>(RIGHT_VALUE-DIVERSION))&&(ADCValue<(RIGHT_VALUE+DIVERSION)) ) { return KEY_RIGHT; }
if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)) == Bit_SET) return KEY_CENTER;
return KEY_NONE;
}
/*************************************************************************
* Function Name: Clk_Init
* Parameters: Int32U Frequency
* Return: Int32U
*
* Description: Init clock system
*
*************************************************************************/
void Clk_Init(void)
{
// 1. Cloking the controller from internal HSI RC (8 MHz)
RCC_HSICmd(ENABLE);
// wait until the HSI is ready
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
// 2. Enable ext. high frequency OSC
RCC_HSEConfig(RCC_HSE_ON);
// wait until the HSE is ready
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
// 3. Init PLL
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); // 72MHz
// RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); // 72MHz
RCC_PLLCmd(ENABLE);
// wait until the PLL is ready
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 4. Set system clock divders
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* Flash 1 wait state */
*(vu32 *)0x40022000 = 0x01;
// 5. Clock system from PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
}
/*************************************************************************
* Function Name: USBSettings
* Parameters: None
* Return: None
*
* Description: Initialization of USB
*
*************************************************************************/
void USBSettings(void) {
// Enable GPIOC clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
// Configure PC.12 as output push-pull (LED)
GPIO_WriteBit(GPIOC,GPIO_Pin_12,Bit_SET);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Configure PA.0 as input button (WAKE_UP)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USB_Init(1,2,UsbClassHidConfigure);
HidInit();
// Soft connection enable
USB_ConnectRes(TRUE);
// Enable interrupts
__enable_interrupt();
}
/*************************************************************************
* Function Name: UpdateMenu
* Parameters: Position of menue
* Return: None
*
* Description: Black mark of menu position
*
*************************************************************************/
void UpdateMenu(unsigned char pos) {
Inversion[pos-1] = 1;
if(menu_flag==0) {
if(pos==8) { offset=2; menu_flag=1; }
if(pos==7) { offset=1; }
if(pos==1) { offset=0; }
}
else {
if(pos==8) { offset=2; }
if(pos==2) { offset=1; }
if(pos==1) { offset=0; menu_flag=0; }
}
LCDClear();
LCDStr ( 0, Menu[0+offset], Inversion[0+offset]);
LCDStr ( 1, Menu[1+offset], Inversion[1+offset]);
LCDStr ( 2, Menu[2+offset], Inversion[2+offset]);
LCDStr ( 3, Menu[3+offset], Inversion[3+offset]);
LCDStr ( 4, Menu[4+offset], Inversion[4+offset]);
LCDStr ( 5, Menu[5+offset], Inversion[5+offset]);
LCDUpdate();
Inversion[pos-1] = 0;
}
/*************************************************************************
* Function Name: TestNRF
* Parameters: none
* Return: None
*
* Description: Send and receive one byte
*
*************************************************************************/
void TestNRF(void) {
// BUTTON1 =================================================================
// Check button1 pressed
// if (((BUT1)==0) && (but1_flag==0)) {
if (((BUT2)==Bit_SET) && (but2_flag==0)) {
// Send one byte -> 0x45 -------------------------------------------------
// Chip enable low
CE_LOW();
// Setting for TX device
// Write CONFIG register -> 00001010 - CRC enable, power-up, TX
status = SPI_Send_command_with_ADDR(W_REGISTER,CONFIG_REG_ADDR, 0x0A);
// Send payload - send any data
status = SPI_Send_command_without_ADDR(W_TX_PAYLOAD, 0x45);
// Pulse for CE -> starts the transmission.
CE_HIGH();
CE_LOW();
// Read STATUS register
status = SPI_Send_command_without_ADDR(NOP, NOP);
// if exceed number of transmision packets
if ((status & MAX_RT) != 0) {
// Clear MAX_RT bit in status register
status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|MAX_RT));
// No communication event here
// ....
}
// If packet sent on TX
if ((status & TX_DS) != 0) {
// Clear TX_DS bit in status register
status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|TX_DS));
// Your code here
// ...
}
// If TX full
if ((status & TX_FULL) != 0) {
// Flush TX FIFO (in TX mode)
status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NOP);
// Your code here
// ...
}
// End send one byte -> 0x45 ---------------------------------------------
// Setting for RX device
//Write CONFIG register -> 00001010 - CRC enable, power-up, RX
status = SPI_Send_command_with_ADDR(W_REGISTER,CONFIG_REG_ADDR, 0x0B);
// button was pressed - set flag
but2_flag=1;
}
// Clear if button is already not pressed
//if (((BUT1)!=0) && (but1_flag !=0)) {
if (((BUT2)!=Bit_SET) && (but2_flag !=0)) {
// Just simple delay
Delay_(BUT_TIME);
// clear button flag
but2_flag = 0;
}
// Chip enable high
CE_HIGH();
// wait for receive signal - IRQ
if ((IRQ)==0) {
//Read STATUS status register
status = SPI_Send_command_without_ADDR(NOP, NOP);
// Set high when new data arrives RX FIFO
if ((status & RX_DR) != 0) {
// Chip enable low
CE_LOW();
//Read payload data
payload=SPI_Send_command_without_ADDR(R_RX_PAYLOAD, NOP);
// Clear RX_DR bit in status register
status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|RX_DR));
}
// Check received data
if (payload == 0x46) {
// Clear data
payload = 0;
// LCD init
LCDInit();
LCDContrast(0x45);
LCDClear();
LCDStr ( 0, " NRF Test ", 0 );
LCDStr ( 1, " SUCCESS!!! ", 0 );
LCDStr ( 5, "exit ", 0 );
LCDUpdate();
}
}
}
unsigned char value_h;
unsigned char value_l;
unsigned int value;
unsigned char val;
#define CMD_WRITE 0
#define CMD_READ 1
// #define LIS_ADDRESS 0x1D
#define LIS_ADDRESS 0x3A
// #define REG_WHO_AM_I 0x0f
#define REG_WHO_AM_I 0x20
void PrbI2C1(void) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -