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

📄 main.c

📁 1、程序目的:介绍AT91SAM7S256-EK TWI的基本用法: 2、 功能说明:通过TWI实现I2C
💻 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 + -