📄 main.c
字号:
//*----------------------------------------------------------------------------
//* File Name : main.c
//* Object : main application written in C
//* Creation : 31/Jan/05 JPP
//修改 :张正锋 embed_tech@126.com
//*----------------------------------------------------------------------------
// Include Standard LIB files
#include "Board.h"
#include "main.h"
#include "twi.h"
#define AT91C_EEPROM_I2C_ADDRESS (0x50<<16)
const int led_mask[NB_LED]= {LED1, LED2, LED3, LED4};
static const char POLLING_header[]={"\n\r *** ZZF TWI FOR 24LCXX ***\n\r"};
volatile char message[80];
volatile int loop;
char value,putanykey=0;
//*----------------------------------------------------------------------------
//* Function Name : Trace_Toggel_LED
//* Object : Toggel a LED
//*----------------------------------------------------------------------------
void Trace_Toggel_LED (unsigned int Led)
{
if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & Led ) == Led )
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, Led );
}
else
{
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, Led );
}
}
//*--------------------------------------------------------------------------------------
//* Function Name : wait
//* Object : Software waiting loop
//* Input Parameters : none. Waiting time is defined by the global variable LedSpeed.
//* Output Parameters : none
//*--------------------------------------------------------------------------------------
void wait ( void )
{
//Wait at least 10 ms before value is written into EEPROM
for (loop=0; loop<47000; loop++)
{
//AT91F_TestEEPROM();
if (AT91F_DBGU_Get(&value) == 0 ){ putanykey=0x22; return; };
}
}
//*----------------------------------------------------------------------------
//* \fn AT91F_TestEEPROM
//* \brief test EEPROM
//*----------------------------------------------------------------------------
int AT91F_TestEEPROM(void){
char write, read,status,i;
char write_byte[255],read_byte[255];
unsigned int address;
//open the TWI
AT91F_TWI_Open();
AT91F_DBGU_Printk("write 255 byte begin at (0x0) :");
AT91F_DBGU_scanf("%x",&address);
AT91F_DBGU_Printk("\n\r ");
// Write 255 byte
for(i=0;i<255;i++)
{
write_byte[i]=i;
status =AT91F_TWI_WriteByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE, address, &write_byte[i], 1);
if (status){
sprintf((char*) message,"Write Satus = %d\n\r",status);
AT91F_DBGU_Printk((char*)message);
}
sprintf((char*) message,"0x%x",write_byte[i]);
AT91F_DBGU_Printk((char*)message);
address++;
}
AT91F_DBGU_Printk("\n\r ");
AT91F_DBGU_Printk("\n\r ");
// Wait 10 ms before data is written into EEPROM
wait();
AT91F_DBGU_Printk("read 255 byte is :\n\r ");
address=address-255;
for(i=0;i<255;i++)
{
status =AT91F_TWI_ReadByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE, address, &read_byte[i], 1);
if (status){
sprintf((char*) message,"Write Satus = %d\n\r",status);
AT91F_DBGU_Printk((char*)message);
}
sprintf((char*) message,"0x%x",read_byte[i]);
AT91F_DBGU_Printk((char*)message);
address++;
}
for(i=0;i<255;i++)
{
if (read_byte[i]!= write_byte[i]){
AT91F_DBGU_Printk("\n\r ");
AT91F_DBGU_Printk("\n\r ");
AT91F_DBGU_Printk("Error during test\n\r");
sprintf((char*) message,"Error during test write 0x%X and read 0x%X\n\r",write,read);
AT91F_DBGU_Printk((char*)message);
return -1;
}
}
AT91F_DBGU_Printk("\n\r ");
AT91F_DBGU_Printk("\n\r ");
AT91F_DBGU_Printk("Test TWI OK\n\r");
return 0;
}
//*----------------------------------------------------------------------------
//* Function Name : menu
//* Object : Usart debug menu
//* Input Parameters : None
//* Output Parameters : None
//*----------------------------------------------------------------------------
void menu( char value)
{
unsigned int address,tmp,status;
char write, read;
switch (value) {
case '0': //* infoAT91PS_TWI->TWI_CWGR
sprintf((char*) message,"AT91C_TWI_CWGR 0x%X\n\r",(unsigned int) *AT91C_TWI_CWGR);
AT91F_DBGU_Printk((char*)message);
sprintf((char*) message,"AT91C_TWI_IADR 0x%X\n\r",(unsigned int) *AT91C_TWI_IADR);
AT91F_DBGU_Printk((char*)message);
sprintf((char*) message,"AT91C_TWI_SR 0x%X\n\r",(unsigned int) *AT91C_TWI_SR);
AT91F_DBGU_Printk((char*)message);
sprintf((char*) message,"AT91C_TWI_IMR 0x%X\n\r",(unsigned int) *AT91C_TWI_IMR);
AT91F_DBGU_Printk((char*)message);
sprintf((char*) message,"AT91C_TWI_MMR 0x%X\n\r",(unsigned int) *AT91C_TWI_MMR);
AT91F_DBGU_Printk((char*)message);
sprintf((char*) message,"AT91C_TWI_THR 0x%X\n\r",(unsigned int) *AT91C_TWI_THR);
AT91F_DBGU_Printk((char*)message);
sprintf((char*) message,"AT91C_TWI_RHR 0x%X\n\r",(unsigned int) *AT91C_TWI_RHR);
AT91F_DBGU_Printk((char*)message);
break;
case '1':
AT91F_DBGU_Printk("Open TWI\n\r");
AT91F_TWI_Open();
break;
case '2':
AT91F_DBGU_Printk("Write byte at (0x0) :");
AT91F_DBGU_scanf("%x",&address);
AT91F_DBGU_Printk("\n\rWrite byte val (0x0) :");
AT91F_DBGU_scanf("%x",&tmp);
write = (char)tmp;
sprintf((char*) message,"\n\rWrite 0x%x at 0x%x \n\r",write,address);
AT91F_DBGU_Printk((char*)message);
// Write a byte
status = AT91F_TWI_WriteByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE, address, &write, 1);
if (status){
sprintf((char*) message,"Write Satus = %d\n\r",status);
AT91F_DBGU_Printk((char*)message);
}
break;
case '3':
AT91F_DBGU_Printk("\n\rWrite byte val (0x0) :");
AT91F_DBGU_scanf("%x",&tmp);
write = (char)tmp;
sprintf((char*) message,"\n\rWrite 0x%x \n\r",write);
AT91F_DBGU_Printk((char*)message);
// Write a byte
status = AT91F_TWI_WriteByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS, 0, &write, 1);
if (status){
sprintf((char*) message,"Write Satus = %d\n\r",status);
AT91F_DBGU_Printk((char*)message);
}
break;
case '4':
AT91F_DBGU_Printk("Read byteat (0x0) :");
AT91F_DBGU_scanf("%x",&address);
status = AT91F_TWI_ReadByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE,address, &read, 1);
if (status){
sprintf((char*) message,"Read Satus = %d\n\r",status);
AT91F_DBGU_Printk((char*)message);
}
sprintf((char*) message,"\n\rRead 0x%X at 0x%X\n\r",read, address);
AT91F_DBGU_Printk((char*)message);
break;
case '5':
AT91F_DBGU_Printk("Read byteat (0x0) :");
AT91F_DBGU_scanf("%x",&address);
status = AT91F_TWI_ReadByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS ,0, &read, 1);
if (status){
sprintf((char*) message,"Read Satus = %d\n\r",status);
AT91F_DBGU_Printk((char*)message);
}
sprintf((char*) message,"\n\rRead 0x%X at 0x%X\n\r",read, address);
AT91F_DBGU_Printk((char*)message);
break;
case '6': //* Test EEPROM
AT91F_DBGU_Printk("Test EEPROM\n\r");
address = AT91F_TestEEPROM();
break;
case '7': //* Change speed
AT91F_DBGU_Printk("Write byte TWI_CWGR (0x0) :");
AT91F_DBGU_scanf("%x",&address);
sprintf((char*) message,"\n\rTWI_CWGR = 0x%X \n\r", address);
AT91F_DBGU_Printk((char*)message);
AT91C_BASE_TWI->TWI_CWGR = address;
break;
default:
AT91F_DBGU_Printk("0)Info\n\r1)Open TWI\n\r2)Write byte EEPROML\n\r3)Write byte (IADRSZ=0)\n\r4)Read Byte EEPROM\n\r5)Read Byte (IADRSZ=0)\n\r6)EEPROM\n\r7) Change speed\n\r");
break;
}
}
//*----------------------------------------------------------------------------
//* Function Name : main
//* Object : Main function
//* Input Parameters : none
//* Output Parameters : TRUE
//*----------------------------------------------------------------------------
int main( void )
{
int i;
//使能PIOA的时钟
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB ) ;
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED_MASK) ;
wait(); wait(); ;
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK) ;
wait(); wait(); ;
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED_MASK) ;
AT91F_PIO_CfgOutput( AT91C_BASE_PIOB, BUZZER) ;
//关闭--结合开发板硬件考虑
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK) ;
AT91F_PIO_SetOutput( AT91C_BASE_PIOB,BUZZER);
//设置用户按键复位功能 (复位时间大约 512*(1/32k)=16ms)
// AT91F_RSTSetMode(AT91C_BASE_RSTC,(8<<8)|(1<<0)); //函数原形 in lib_AT91SAM7A3.h
//初始化DBGU端口
AT91F_DBGU_Init();
//* Polling
AT91F_DBGU_Printk((char*)POLLING_header);
AT91F_DBGU_Printk("0)Info\n\r1)Open TWI\n\r2)Write byte EEPROML\n\r3)Write byte (IADRSZ=0)\n\r4)Read Byte EEPROM\n\r5)Read Byte (IADRSZ=0)\n\r6)7) Change speed\n\r");
for (;;)
{
//顺时针依次亮灭
for ( i=0 ; i < NB_LED ; i++ )
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[i]) ;
wait(); wait(); ;
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[i] ) ;
wait(); wait();
}
//AT91F_TestEEPROM();
if (putanykey!= 0 )
{
putanykey=0;
menu(value);
AT91F_PIO_ClearOutput( AT91C_BASE_PIOB,BUZZER);
wait(); wait(); wait();
AT91F_PIO_SetOutput( AT91C_BASE_PIOB,BUZZER);
wait(); wait(); wait();
}
//逆时针依次亮灭
for ( i=(NB_LED-1) ; i >= 0 ; i-- )
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[i]) ;
wait(); wait();wait();
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[i] ) ;
wait(); wait(); wait();
}
}
}//* End
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -