元旦放假,急于赶一个小项目,做了一个M0516LAN驱动SIM900A的测试。第一次用SIM900A,其中遇到几个小问题,调了好久,也问过群里用过SIM900A的几位朋友才调通,在此感谢。最弱智的问题是我把NRESET接到了PWM3上,然后又启动了PWM3,虽然后面把P43置成IO输出却不成功,然后大半晚上就那么悲剧掉了。新唐的库是置成了复用功能再想置回IO,需要先DrvGPIO_InitFunction(E_FUNC_GPIO);才能配置IO功能的。我后来还是不启动PWM就通过了开机过程。只要SIM900A开机了,NETLIGHT的LED就会闪烁,不管有没有SIM卡。另外,所有SIM900A的AT命令都是以“ ”结束的。
“sim900a.c ”文件源码如下:
#include
#include
#include "DriverDrvUART.h"
#include "DriverDrvGPIO.h"
#include "DriverDrvSYS.h"
#define PWRKEY E_PORT2, E_PIN1
#define NRESET E_PORT4, E_PIN3
#define STATUS E_PORT2, E_PIN3
#define RI E_PORT3, E_PIN2
#define CTS E_PORT0, E_PIN0
/*
_________________________________________________
| M0516LAN SIM900A |
| |
| P21 PWRKEY ----> PWRKEY |
| P43 NRESET ----> NRESET |
| P23 STATUS <---- STATUS |
| P32 RI <---- RI |
| P00 CTS1 <---- CTS |
| P13 TXD1 ----> RXD |
| P12 RXD1 <---- TXD |
|_______________________________________________|
*/
int UART1_init(void)
{
STR_UART_T sParam;
/* Set UART1 Pin */
DrvGPIO_InitFunction(E_FUNC_UART1);
// outpw(&SYS->P1_MFP, (inpw(&SYS->P1_MFP) | (0x3<<10)) & ~(0x3<<2));
// outpw(&SYS->P0_MFP, (inpw(&SYS->P0_MFP) | (0x3<<8)) & ~(0x3<<0));
/* Select UART1 Clock Source From 12Mhz*/
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);
/* UART1 Setting */
sParam.u32BaudRate = 9600;
sParam.u8cDataBits = DRVUART_DATABITS_8;
sParam.u8cStopBits = DRVUART_STOPBITS_1;
sParam.u8cParity = DRVUART_PARITY_NONE;
sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;
if(DrvUART_Open(UART_PORT1,&sParam) != E_SUCCESS)
{
printf("UART1 open failed
");
return FALSE;
}
/* Enable Interrupt and install the call back function */
// DrvUART_EnableInt(UART_PORT1, (DRVUART_RLSINT | DRVUART_RDAINT),UART1_INT_HANDLE);
/* Disable Interrupt */
// DrvUART_DisableInt(UART_PORT1,DRVUART_RLSINT | DRVUART_THREINT | DRVUART_RDAINT);
return TRUE;
}
int SIM900A_Open(void)
{
int dly;
DrvGPIO_ClrBit(PWRKEY);
for(dly=0;dly<2000;dly++) DrvSYS_Delay(1000); //delay 1S
DrvGPIO_SetBit(PWRKEY);
for(dly=0;dly<3000;dly++) DrvSYS_Delay(1000); //delay 3S
if(DrvGPIO_GetBit(STATUS))
{
printf("SIM900A Open Success!!!
");
return 1;
}
else
{
printf("SIM900A Open Failure!!!
");
return 0;
}
}
int SIM900A_Close(void)
{
int dly;
DrvGPIO_ClrBit(PWRKEY);
for(dly=0;dly<6000;dly++) DrvSYS_Delay(1000); //delay 1S-5S
DrvGPIO_SetBit(PWRKEY);
for(dly=0;dly<4000;dly++) DrvSYS_Delay(1000); //delay 2S
if(DrvGPIO_GetBit(STATUS))
{
printf("SIM900A Close Failure!!!
");
return 1;
}
else
{
printf("SIM900A Close Success!!!
");
return 0;
}
}
int SIM900A_Reset(void)
{
int dly;
DrvGPIO_ClrBit(NRESET);
DrvSYS_Delay(100); //delay 20uS-50uS
DrvGPIO_SetBit(NRESET);
for(dly=0;dly<2000;dly++) DrvSYS_Delay(1000); //delay 2S
if(DrvGPIO_GetBit(STATUS)==1)
return 1;
else
return 0;
}
int SIM900A_init(void)
{
int ret =0;
DrvGPIO_Open(STATUS, E_IO_INPUT);
DrvGPIO_Open(RI, E_IO_INPUT);
DrvGPIO_Open(CTS, E_IO_INPUT);
DrvGPIO_Open(PWRKEY, E_IO_OUTPUT);
DrvGPIO_Open(NRESET, E_IO_OUTPUT);
DrvGPIO_SetBit(PWRKEY);
DrvGPIO_SetBit(NRESET);
ret = SIM900A_Open();
UART1_init();
return ret;
}[page]
int SIM900A_gets(char *buf)
{
int ret=0;
int dly=3000000; // delay 3S
while(dly-->1)
{
if(UART1->FSR.RX_EMPTY == 0 )
{
*buf++ =UART1->DATA;//printf("%c",*(buf-1));
ret++;dly=10000; //delay 10ms
}
DrvSYS_Delay(1); //delay 1us
}
return ret;
}
void SIM900A_puts(const char *buf)
{
while(*buf)
{
while(UART1->FSR.TX_FULL == 1);
UART1->DATA =(*buf++)&0xff;//printf("%c",*(buf-1));
}
}
// AT+CPOWD=1 //Power down
// AT+CFUN=x //Power Saving
// AT+CBC //monitor the supply voltage
// AT+IPR=x //fixed baud rate ,“RDY” is received
// AT+CSCLK=1 //enable the SLEEP mode
// AT+CMIC //adjust the input gain level of microphone
// AT+SIDET //set the side-tone level
// AT+CLVL //adjust the output gain level
// AT+CADC //read the voltage value on ADC
void SIM900A_test(void)
{
char buffer[128];
printf("
");
printf("*** 9G-M0516 V1.00 Build by yuanxihua@21cn.com on ("__DATE__ " - " __TIME__ ")
");
printf("*** 9G-M0516 V1.00 Rebooting ...
");
SIM900A_init();
printf("SIM900A_test Send AT COMMAND @ 9600 bps !!!
");
// SIM900A_puts("ATI
");
SIM900A_puts("AT+GMM
");
if(SIM900A_gets(buffer)>0)
{printf("
%s
",buffer);}
}
//源码完毕。--缥缈九哥调试通过。
半主机的调试信息如下:
*** 9G-M0516 V1.00 Build by yuanxihua@21cn.com on (Jan 3 2012 - 13:16:32)
*** 9G-M0516 V1.00 Rebooting ...
SIM900A Open Success!!!
SIM900A_test Send AT COMMAND @ 9600 bps !!!
AT+GMM
SIMCOM_SIM900A
OK
上一篇:基于新唐NUC120RD2BN的EBI接口的ILI9327的驱动程序
下一篇:基于新唐M0516LAN的SD5128的驱动测试
推荐阅读最新更新时间:2024-03-16 14:26