📄 main.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 + -