新项目开始咯,其实就是华清项目的换皮,增强了对传感器的控制加了大量的32采集与控制节点,由于时间紧迫先按照节点发布文章。以后有时间会发一些框架和整体数据流向分析的文章。
一、RFID节点框架
我的想法是使用超高频RFID技术,在门口布置一个大型的RFID读写器,采集出入货物电子标签的信息,这个电子标签也可以只有ID,但这样就要在这个节点加一个数据库,32这么小的内存就不太够了,需要换成A9.因为我只会这两个型号的单片机所以哈哈。
在ZET6上使用串口连接一个cc2530.使用SPI来和RC522通信.超高频的RFID读写器太贵了好几千真的没钱了。所以使用RC522代替一下。主要这个范围太小只能拿ID卡来模拟咯。
蜂鸣器是为了整个系统报警用的。可以换成继电器控制那种特别响的大功率报警器。OLED用来显示信息。但是它太小了也就能显示个ID。所以我换了我以前买的一块触摸屏。100块(太痛了)。
二、具体的程序
首先需要使用来把字库传到我们的串行Flash
使用的是UNIGBK.bin字库烧入到SD卡然后写个SD卡驱动,当然不是我写的。直接就是调用哈哈。
/********************************************************************************* 文件名程: main.c * 作 者: 硬石嵌入式开发团队* 版 本: V1.0* 编写日期: 2015-10-04* 功 能: 中文字库烧写******************************************************************************* 说明:* 本例程配套硬石stm32开发板YS-F1Pro使用。* * 淘宝:* 论坛:http://www.ing10bbs.com* 版权归硬石嵌入式开发团队所有,请勿商用。*******************************************************************************/ //使用之前:
//1.保证已经把字库文件拷贝到SD卡内并插入到开发板上,
//五个文件:stxinhei16.xbf,kaiti24.xbf,UNIGBK.BIN,GBK_HZ1616.FON和GBK_HZ2424.FON
//2.使用该工程写字库文件需要一定时间请耐心等候保存字库写入成功
//3.使用该工程建议使用串口调试助手工具查看字库写入进度。/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/beep/bsp_beep.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/spi_flash/bsp_spi_flash.h"
#include "ff.h"/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
#define GBK_HZ1616 (1) //1:使能烧写GBK_HZ1616.FON字库文件(裸机中文显示专用);0:不烧写
#define GBK_HZ2424 (1) //1:使能烧写GBK_HZ2424.FON字库文件(裸机中文显示专用);0:不烧写
#define FATFS_UNIGBK (1) //1:使能烧写UNIGBK.BIN字库文件(FatFS文件系统专用);0:不烧写
#define XBF_STXIHEI16 (1) //1:使能烧写stxihei16.xbf字库文件(STemWin专用);0:不烧写
#define XBF_KAITI24 (1) //1:使能烧写kaiti24.xbf字库文件(STemWin专用);0:不烧写#define GBK_HZ1616_ADDR (10*4096) // GBK_HZ1616.FON字库文件存放在串行Flash的地址
#define GBK_HZ2424_ADDR (75*4096) // GBK_HZ2424.FON字库文件存放在串行Flash的地址
#define FATFS_UNIGBK_ADDR (332*4096) // UNIGBK.BIN字库文件存放在串行Flash的地址
#define XBF_STXIHEI16_ADDR (380*4096) // stxihei16.xbf字库文件存放在串行Flash的地址
#define XBF_KAITI24_ADDR (750*4096) // kaiti24.xbf字库文件存放在串行Flash的地址#define GBK_HZ1616_SIZE (64) // GBK_HZ1616.FON字库文件占用扇区数(每个扇区为4096个字节)
#define GBK_HZ2424_SIZE (144) // GBK_HZ2424.FON字库文件占用扇区数(每个扇区为4096个字节)
#define FATFS_UNIGBK_SIZE (43) // UNIGBK.BIN字库文件存放占用扇区数(每个扇区为4096个字节)
#define XBF_STXIHEI16_SIZE (348) // stxihei16.xbf字库文件存占用扇区数(每个扇区为4096个字节)
#define XBF_KAITI24_SIZE (628) // kaiti24.xbf字库文件存占用扇区数(每个扇区为4096个字节)/* 获取缓冲区的长度 */
/* 私有变量 ------------------------------------------------------------------*/
FATFS fs; /* FatFs文件系统对象 */
FIL file; /* 文件对象 */
FRESULT f_res; /* 文件操作结果 */
UINT fnum; /* 文件成功读写数量 *//* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
static void printf_fatfs_error(FRESULT fresult);
/* 函数体 --------------------------------------------------------------------*//*** 函数功能: 主函数.* 输入参数: 无* 返 回 值: 无* 说 明: 无*/
int main(void)
{ uint32_t write_addr=0,j=0;uint8_t tempbuf[256]={0};/* 初始化LED灯 */LED_GPIO_Init();/* 初始化独立按键 */ KEY_GPIO_Init();/* 初始化蜂鸣器 */BEEP_GPIO_Init();/* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */DEBUG_USART_Init(); printf("****** 这是一个烧写中文字库到串行Flash空间内实验 ******\n");printf("》》按下开发板KEY1按键开始烧写\n");while(KEY1_StateRead()==KEY_UP);//等待按键被按下/* 初始化串行Flash */SPI_FLASH_Init();//挂载文件系统f_res = f_mount(&fs,"0:",1); printf_fatfs_error(f_res);//如果文件系统挂载失败就停机if(f_res != FR_OK){while(1);}/************************** GBK_HZ1616.FON字库文件 *****************************************/
#if GBK_HZ1616f_res = f_open(&file,"0:GBK_HZ1616.FON",FA_OPEN_EXISTING | FA_READ);printf("f_open GBK_HZ1616.FON res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=GBK_HZ1616_ADDR;for(j=0;j<GBK_HZ1616_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=GBK_HZ1616_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据 if(f_res!=FR_OK)break; //执行错误 SPI_FLASH_PageWrite(tempbuf,write_addr,256); //拷贝数据到串行flash上 write_addr+=256; j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,GBK_HZ1616_ADDR,256); //读取数据,打印验证printf("readbuf GBK_HZ1616.FON:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED1_ON;BEEP_OFF;
#endif //#if GBK_HZ1616
/************************** END GBK_HZ1616.FON字库文件 *****************************************/ /************************** GBK_HZ2424.FON字库文件 *****************************************/
#if GBK_HZ2424f_res = f_open(&file,"0:GBK_HZ2424.FON",FA_OPEN_EXISTING | FA_READ);printf("f_open GBK_HZ2424.FON res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=GBK_HZ2424_ADDR;for(j=0;j<GBK_HZ2424_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=GBK_HZ2424_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据 if(f_res!=FR_OK)break; //执行错误 SPI_FLASH_PageWrite(tempbuf,write_addr,256); //拷贝数据到串行flash上 write_addr+=256; j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,GBK_HZ2424_ADDR,256); //读取数据,打印验证printf("readbuf GBK_HZ2424.FON:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED2_ON;BEEP_OFF;
#endif //#if GBK_HZ2424
/************************** END GBK_HZ2424.FON字库文件 *****************************************/ /************************** UNIGBK.BIN字库文件 *****************************************/
#if FATFS_UNIGBKf_res = f_open(&file,"0:UNIGBK.BIN",FA_OPEN_EXISTING | FA_READ);printf("f_open UNIGBK.BIN res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=FATFS_UNIGBK_ADDR;for(j=0;j<FATFS_UNIGBK_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=FATFS_UNIGBK_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据 if(f_res!=FR_OK)break; //执行错误 SPI_FLASH_PageWrite(tempbuf,write_addr,256); //拷贝数据到串行flash上 write_addr+=256; j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,FATFS_UNIGBK_ADDR,256); //读取数据,打印验证printf("readbuf UNIGBK.BIN:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED3_ON;BEEP_OFF;
#endif //#if FATFS_UNIGBK
/************************** END UNIGBK.BIN字库文件 *****************************************/ /************************** stxihei16.xbf字库文件 *****************************************/
#if XBF_STXIHEI16f_res = f_open(&file,"0:stxihei16.xbf",FA_OPEN_EXISTING | FA_READ);printf("f_open stxinhei16.xbf res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=XBF_STXIHEI16_ADDR;for(j=0;j<XBF_STXIHEI16_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=XBF_STXIHEI16_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据 if(f_res!=FR_OK)break; //执行错误 SPI_FLASH_PageWrite(tempbuf,write_addr,256); //拷贝数据到串行flash上 write_addr+=256; j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,XBF_STXIHEI16_ADDR,256); //读取数据,打印验证printf("readbuf stxihei16.xbf:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED1_OFF;BEEP_OFF;
#endif //#if XBF_STXIHEI16
/************************** END stxihei16.xbf字库文件 *****************************************/ /************************** kaiti24.xbf字库文件 *****************************************/
#if XBF_KAITI24f_res = f_open(&file,"0:kaiti24.xbf",FA_OPEN_EXISTING | FA_READ);printf("f_open kaiti24.xbf res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=XBF_KAITI24_ADDR;for(j=0;j<XBF_KAITI24_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=XBF_KAITI24_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据 if(f_res!=FR_OK)break; //执行错误 SPI_FLASH_PageWrite(tempbuf,write_addr,256); //拷贝数据到串行flash上 write_addr+=256; j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,XBF_KAITI24_ADDR,256); //读取数据,打印验证printf("readbuf kaiti24.xbf:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED3_OFF;BEEP_OFF;
#endif //#if XBF_KAITI24
/************************** END kaiti24.xbf字库文件 *****************************************/ //不再使用文件系统,取消挂载文件系统f_res = f_mount(NULL,"0:",1);/* 无限循环 */while (1){ }
}/*** 函数功能: FatFS文件系统操作结果信息处理.* 输入参数: FatFS文件系统操作结果:FRESULT* 返 回 值: 无* 说 明: 无*/
static void printf_fatfs_error(FRESULT fresult)
{switch(fresult){case FR_OK: //(0)printf("》操作成功。\n");break;case FR_DISK_ERR: //(1)printf("!!硬件输入输出驱动出错。\n");break;case FR_INT_ERR: //(2)printf("!!断言错误。\n");break;case FR_NOT_READY: //(3)printf("!!物理设备无法工作。\n");break;case FR_NO_FILE: //(4)printf("!!无法找到文件。\n");break;case FR_NO_PATH: //(5)printf("!!无法找到路径。\n");break;case FR_INVALID_NAME: //(6)printf("!!无效的路径名。\n");break;case FR_DENIED: //(7)case FR_EXIST: //(8)printf("!!拒绝访问。\n");break;case FR_INVALID_OBJECT: //(9)printf("!!无效的文件或路径。\n");break;case FR_WRITE_PROTECTED: //(10)printf("!!逻辑设备写保护。\n");break;case FR_INVALID_DRIVE: //(11)printf("!!无效的逻辑设备。\n");break;case FR_NOT_ENABLED: //(12)printf("!!无效的工作区。\n");break;case FR_NO_FILESYSTEM: //(13)printf("!!无效的文件系统。\n");break;case FR_MKFS_ABORTED: //(14)printf("!!因函数参数问题导致f_mkfs函数操作失败。\n");break;case FR_TIMEOUT: //(15)printf("!!操作超时。\n");break;case FR_LOCKED: //(16)printf("!!文件被保护。\n");break;case FR_NOT_ENOUGH_CORE: //(17)printf("!!长文件名支持获取堆空间失败。\n");break;case FR_TOO_MANY_OPEN_FILES: //(18)printf("!!打开太多文件。\n");break;case FR_INVALID_PARAMETER: // (19)printf("!!参数无效。\n");break;}
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
这是硬石给的官方模板。写的真的太好了,我就直接拿来用了。烧入完编写我们的RFID程序。因为文件很多下面我只分享主文件。等项目完工我会整个上传到git仓库到时候评论区放链接。
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdlib.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/lcd/bsp_lcd.h"
#include "bsp/RC522/rc522_function.h"
#include "bsp/RC522/rc522_config.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/beep/bsp_beep.h"
//#include "bsp/usart/bsp_usart2.h"/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
unsigned char RFID[16];
unsigned char card_1[4]={176,42,57,82};
uint8_t KEY[6]={0xff,0xff,0xff,0xff,0xff,0xff};
uint8_t Rxflag=0;
uint8_t ucTemp;
uint8_t ucaRxBuf[256];
uint16_t usRxCount;/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
void IC_test ( void );
int test(void);/* 函数体 --------------------------------------------------------------------*/
/***************************** 重要说明 ********************************* 使用本例程之前,需要运行“YSF1-051. 烧写中文字库到串行Flash”例程******************************************************************************//*** 函数功能: 主函数.* 输入参数: 无* 返 回 值: 无* 说 明: 无*/
int main(void)
{ uint32_t lcdid;/* 初始化3.5寸TFT液晶模组,一般优先于调试串口初始化 */lcdid=BSP_LCD_Init(); /* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */DEBUG_USART_Init();BEEP_GPIO_Init();SysTick_Init(); RC522_Init (); /* 调用格式化输出函数打印输出数据 */printf("LCD ID=0x%08X\n",lcdid); /* 开背光 */LCD_BK_ON();PcdReset();M500PcdConfigISOType ( 'A' );//设置工作方式while ( 1 ){printf("\nRFID start\n");Delay_ms(1000);IC_test ();//IC卡检测 //scanf("%s",ucaRxBuf);if(test() == 1){printf("%s\r\n",ucaRxBuf);LCD_DispString_EN(0,20,ucaRxBuf,BLACK, YELLOW,FONT_24);}printf("\nRFID stop\n");}
}/** * 接收串口的数据,分析并处理 * 可以将此段代码封装为一个函数,在主程序其它流程调用
*/
int test()
{if(Rxflag){if (usRxCount < sizeof(ucaRxBuf)){ucaRxBuf[usRxCount++] = ucTemp;}else{usRxCount = 0;}/* 遇到换行字符,认为接收到一个命令 */if (ucTemp == '+') /* 换行字符 */{usRxCount = 0;return 1;}Rxflag=0;}return 0;
}/*** 函数功能: 门禁测试函数* 输入参数: 无* 返 回 值: 无* 说 明: 无*/
void IC_test ( void )
{char cStr [ 30 ];//unsigned char s=0x08;unsigned char ucArray_ID [ 4 ]; //先后存放IC卡的类型和UID(IC卡序列号)uint8_t ucStatusReturn; //返回状态//uint8_t *len;//uint8_t *buf;//while ( 1 ){ /*寻卡*/if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK ) /*若失败再次寻卡*/ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ); if ( ucStatusReturn == MI_OK ){/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/if ( PcdAnticoll ( ucArray_ID ) == MI_OK ) {sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] ); printf ( "%s\r\n",cStr ); LCD_DispString_EN(0,0,cStr,BLACK, YELLOW,FONT_24);//USART_printf(USART2," \r\n %s \r\n",cStr);/*选卡*/ucStatusReturn=PcdSelect(ucArray_ID) ; } }//scanf("%s",buf);//printf("%c",USART_ReceiveData(USARTx));//LCD_DispString_EN(0,20,get_rebuff(len),BLACK, YELLOW,FONT_24);}
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
void USART1_IRQHANDLER(void)
{printf("/n11111/n");if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ Rxflag=1; ucTemp = USART_ReceiveData(USART1);} }/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
目前还只能读RFID通过zigbee发送,无法处理zigbee接收到的信息神奇。
应该是程序没写好等我后面一起发
三、GPIO分配表
cc2530:
PA2/USART2_TXD 串口2发送
PA3/USART2_RXD 串口2接收
RC522:
PB12/TIM1_BKIN CS
PB13/TIM1_CH1N SCK
PB14/TIM1_CH2N MOSI
PB15/TIM1_CH3N MISO
PC0/ADC123_IN10/OV_D0 restart
TFT:
省略,这块不懂原理我就直接用了
PE2/TP_NIRQ 电阻触摸屏中断
PE3/TP_SCK 电阻触摸屏时钟线
PE4/TP_MOSI 电阻触摸屏数据线
PE5/TP_MISO 电阻触摸屏数据线
PE6/TP_CS 电阻触摸屏片选
经典A9,A10串口一蜂鸣器:
PD7/BEEP 蜂鸣器