⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 IAR EWARM嵌入式系统编程与实践光盘源码
💻 C
字号:
//  main.c

#include "Board.h"
#include "Main.h"
#include "lib_twi.h"

#define AT91C_EEPROM_I2C_ADDRESS  	(0x50<<16)

static const char POLLING_header[]={"\n\r  *** ATMEL TWI ***\n\r"};

volatile char message[80];
volatile int loop;
/*******************************************************************************
 * 说明:wait函数,软件延时
 * 参数:无
 * 返回值:无
*******************************************************************************/
void wait ( void ) {
    for (loop=0; loop<10000; loop++){};   // 数据写入EEPROM至少需要等待10ms
}

/*******************************************************************************
 * 说明:AT91F_TestEEPROM函数,测试EEPROM
 * 参数:无
 * 返回值:int
 *         0:成功
 *        -1:失败
*******************************************************************************/
int AT91F_TestEEPROM(void){
	char write, read,status;
	AT91F_TWI_Open();                 // 初始化TWI器件
	write = 0x55;
	// 先写入再读取一个字节
	 status =AT91F_TWI_WriteByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE, 0x04, &write, 1);
	 if (status){
		  sprintf((char*) message,"Write Satus = %d\n\r",status);
		  AT91F_DBGU_Printk((char*)message);
         }
       wait();      // 等待10ms
	status =AT91F_TWI_ReadByte(AT91C_BASE_TWI, AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE, 0x04, &read, 1);
	 if (status){
		  sprintf((char*) message,"Read Satus = %d\n\r",status);
		  AT91F_DBGU_Printk((char*)message);
         }
	if (read == write){
		AT91F_DBGU_Printk("Test TWI OK\n\r");
                return 0;
	} else {
		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;
	}
}

/*******************************************************************************
 * 说明:menu函数,从DEBUG串口输出菜单
 * 参数:char value
 * 返回值:无
*******************************************************************************/
void menu( char value) {
	unsigned int address,tmp,status;
	char write, read;
	switch (value) {
	case '0': // info
		  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': // Write byte EEPROML
          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':// Write byte (IADRSZ=0)
          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);
          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': // Read Byte EEPROM
          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': // Read Byte (IADRSZ=0)
          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("\n\r");
		break;
	}
}

/*******************************************************************************
 * 说明:main函数
 * 参数:无
 * 返回值:无
*******************************************************************************/
int main( void ) {
   char value;
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;  // 允许PIOA时钟
    AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;    // 配置PIOA为输出,用于点亮LED
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ) ;    // 熄灭所有LED
    Trace_Toggel_LED(LED1);                               // 点亮LED1
    AT91F_DBGU_Init();                                    // 初始化DEBUG串口
    AT91F_DBGU_Printk((char*)POLLING_header);             // 从DEBUOG串口输出表头和菜单
    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)TEST EEPROM\n\r7)Change speed\n\r\n\r");
    while(1)  {
	if (AT91F_DBGU_Get(&value) == 0 ) menu(value);    // 查询菜单输入
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -