找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10903|回复: 5
打印 上一主题 下一主题
收起左侧

谁会pn532 i2c通信例程(nfc通信模块)

[复制链接]
跳转到指定楼层
楼主
ID:69679 发表于 2015-9-23 19:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
在淘宝上买了个nfc射频卡模块(新版PN532 NFC RFID V3 模块 近场通信,支持和Android手机通信),上网查了一些资料,大多数都是串口通信,而且还是arduino例程,我想用C语言i2c通信,谁会留个联系方式,或者给点例程、资料什么的?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:69679 发表于 2015-9-25 08:19 | 只看该作者
怎么没人回答?那给个串口的程序总该有吧?拜托了!!!!!
回复

使用道具 举报

板凳
ID:91284 发表于 2015-9-29 10:44 | 只看该作者
  1. #include <hidef.h>           /* common defines and macros */
  2. #include "derivative.h"      /* derivative-specific definitions */

  3. #define WHO_AM_I 0x0F

  4. #define CTRL_REG1 0x20     
  5. #define CTRL_REG2 0x21     
  6. #define CTRL_REG3 0x22
  7. #define CTRL_REG4 0x23
  8. #define CTRL_REG5 0x24

  9. #define OUT_X_L 0x28
  10. #define OUT_X_H 0x29
  11. #define OUT_Y_L 0x2A
  12. #define OUT_Y_H 0x2B
  13. #define OUT_Z_L 0x2C
  14. #define OUT_Z_H 0x2D

  15. #define        SlaveAddress   0xD2         
  16. //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改

  17. #define SCL PTM_PTM2
  18. #define SDA PTM_PTM5

  19. #define SCL_dir DDRM_DDRM2
  20. #define SDA_dir DDRM_DDRM5

  21. #define  BUS_CLOCK                   48000000           //总线频率
  22. #define  OSC_CLOCK                   16000000           //晶振频率

  23. #define somenop(); asm("nop"); asm("nop");/*asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");*/\
  24.                    //asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");\
  25.                    //asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");\
  26.                    //asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");

  27. //asm("nop");晶振频率的倒数
  28. char BUF[8];                         //接收数据缓存区
  29. uchar ge,shi,bai,qian,wan;           //显示变量
  30. int dis_data1,dis_data2,dis_data3;//变量
  31. uchar TxBuf[10] = {0,0,0,0,0,0,0,0,0,0};


  32. /*************************************************************/
  33. /*                      初始化锁相环                         */
  34. /*************************************************************/

  35. void INIT_PLL(void)
  36. {
  37.     CLKSEL &= 0x7f;       //set OSCCLK as sysclk
  38.     PLLCTL &= 0x8F;       //Disable PLL circuit
  39.     CRGINT &= 0xDF;
  40.    
  41.     #if(BUS_CLOCK == 48000000)
  42.       SYNR = 0x45;
  43.     #elif(BUS_CLOCK == 40000000)
  44.       SYNR = 0x44;
  45.     #elif(BUS_CLOCK == 32000000)
  46.       SYNR = 0x43;     
  47.     #elif(BUS_CLOCK == 24000000)
  48.       SYNR = 0x42;
  49.     #endif

  50.     REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
  51.     PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
  52.     asm NOP;
  53.     asm NOP;
  54.     while(!(CRGFLG&0x08)); //PLLCLK is Locked already
  55.     CLKSEL |= 0x80;        //set PLLCLK as sysclk
  56. }

  57. /*************************************************************/
  58. /*                        延时函数                           */
  59. /*************************************************************/
  60. void delay(void)
  61. {
  62. unsigned int i;
  63. for(i=0;i<5000;i++);
  64. }

  65. /*************************************************************/
  66. /*                        初始化IIC                          */
  67. /*************************************************************/
  68. void INIT_IIC(void)
  69. {

  70. SCL_dir = 1;
  71. SCL_dir = 1;
  72. SCL = 1;
  73. SDA = 1;
  74. }


  75. /*************************************************************/
  76. /*                         启动IIC                           */
  77. /*************************************************************/
  78. void I2Cstart(void)
  79. {
  80.   SCL_dir = 1;
  81.   SDA_dir = 1;
  82.   SDA = 1;
  83.   somenop();
  84.   SCL = 1;
  85.   somenop();
  86.   somenop();
  87.   SDA = 0;
  88.   somenop();
  89.   somenop();
  90.   SCL = 0;
  91. }


  92. /**************************************
  93. 接收应答信号
  94. **************************************/
  95. void L3G4200D_RecvACK()
  96. {
  97.     SCL_dir = 1;
  98.     SDA_dir = 0;

  99.     SCL = 1;                    //拉高时钟线
  100.     somenop();
  101.     somenop();                 //延时
  102.     while(SDA==1);
  103.     SCL = 0;                    //拉低时钟线
  104.     somenop();
  105.     somenop();                 //延时

  106. }
  107. /*************************************************************/
  108. /*                       IIC发送数据                         */
  109. /*************************************************************/
  110. void I2Csend(byte data)
  111. {
  112. unsigned char i=8;

  113. SCL_dir = 1;
  114. SDA_dir = 1;

  115. for (i=0; i<8; i++)         //8位计数器
  116. {
  117.         SDA = (data&0x80)>>7;               //送数据口
  118.         data=data<<1;
  119.         SCL = 1;                //拉高时钟线
  120.        somenop();
  121.         somenop();             //延时
  122.         SCL = 0;                //拉低时钟线
  123.         somenop();
  124.         somenop();             //延时
  125. }
  126.    
  127. L3G4200D_RecvACK();
  128. }




  129. /*************************************************************/
  130. /*                       IIC接收数据                         */
  131. /*************************************************************/
  132. signed char I2Creceive(void)
  133. {
  134.     byte i;
  135.     byte dat = 0;
  136.    
  137.     SCL_dir = 1;
  138.     SDA_dir = 0;

  139.     for (i=0; i<8; i++)         //8位计数器
  140.     {
  141.         dat <<= 1;                              //这里的1是 00000001
  142.         SCL = 1;                //拉高时钟线
  143.         somenop();
  144.         somenop();             //延时
  145.         dat |= SDA;             //读数据      SDA  00000000 or 00000001         
  146.         SCL = 0;                //拉低时钟线
  147.         somenop();
  148.         somenop();             //延时
  149.     }
  150.     return dat;
  151. }

  152. /**************************************
  153. 发送应答信号
  154. 入口参数:ack (0:ACK 1:NAK)
  155. **************************************/
  156. void I2Csendack(char ack)
  157. {
  158.     SCL_dir = 1;
  159.     SDA_dir = 1;
  160.     if(ack==1)
  161.     {     
  162.        SDA = 1;                  //写应答信号
  163.        SCL = 1;                    //拉高时钟线
  164.        somenop();
  165.        somenop();
  166.        SCL = 0;                    //拉低时钟线
  167.        somenop();
  168.        somenop();
  169.     }
  170.     else
  171.     {
  172.        SDA = 0;                  //写应答信号
  173.        SCL = 1;                    //拉高时钟线
  174.        somenop();
  175.        somenop();
  176.        SCL = 0;                    //拉低时钟线
  177.        somenop();
  178.        somenop();
  179.     }
  180. }





  181. /*************************************************************/
  182. /*                         停止IIC                           */
  183. /*************************************************************/
  184. void I2Cstop(void)
  185. {
  186.   SCL_dir = 1;
  187.   SDA_dir = 1;
  188.   
  189.   SCL = 1;
  190.   SDA = 0;
  191.   somenop();
  192.   somenop();
  193.   SDA = 1;
  194.   somenop();
  195.   somenop();
  196. }

  197. //单字节写入*******************************************

  198. void Single_WriteL3G4200D(uchar REG_Address,uchar REG_data)
  199. {
  200.     I2Cstart();                  //起始信号
  201.     I2Csend(SlaveAddress);   //发送设备地址+写信号
  202.     I2Csend(REG_Address);    //内部寄存器地址,请参考中文pdf22页
  203.     I2Csend(REG_data);       //内部寄存器数据,请参考中文pdf22页
  204.     I2Cstop();                   //发送停止信号
  205. }

  206. //单字节读取*****************************************
  207. uchar Single_ReadL3G4200D(uchar REG_Address)
  208. {
  209.     uchar REG_data;
  210.     I2Cstart();                          //起始信号
  211.     I2Csend(SlaveAddress);           //发送设备地址+写信号
  212.     I2Csend(REG_Address);            //发送存储单元地址,从0开始        
  213.     I2Cstart();                          //起始信号
  214.     I2Csend(SlaveAddress+1);         //发送设备地址+读信号
  215.     REG_data=I2Creceive();              //读出寄存器数据
  216.     I2Csendack(1);  
  217.     I2Cstop();                           //停止信号
  218.     return REG_data;
  219. }
  220. //*************************************************



  221. //*****************************************************************

  222. //初始化L3G4200D,根据需要请参考pdf,第27页,进行修改************************
  223. void InitL3G4200D()
  224. {
  225.    Single_WriteL3G4200D(CTRL_REG1, 0x0f);   //  0x0f=00001111  普通模式   X Y Z 启用。
  226.    Single_WriteL3G4200D(CTRL_REG2, 0x00);   //  选择高通滤波模式和高通截止频率  此为普通模式
  227.    Single_WriteL3G4200D(CTRL_REG3, 0x08);   //  0x08=0000 1000    DRDY/INT2 数据准备(0: Disable; 1: Enable)默认0
  228.    Single_WriteL3G4200D(CTRL_REG4, 0x00 );  //  选择量程    满量程选择(默认 00)(00:250dps)
  229.    Single_WriteL3G4200D(CTRL_REG5, 0x00);   //   篎FIFO使能,高通滤波使
  230. }



  231. void SCI_Init()
  232. {
  233.   SCI1BD = BUS_CLOCK/16/9600;   //设置SCI1波特率为9600
  234.   SCI1CR1 = 0x00;       //设置SCI1为正常模式,八位数据位,无奇偶校验
  235.   SCI1CR2 = 0x0c;       //允许发送和接收数据,禁止中断功能*/
  236.         MODRR|=0X80;
  237.   
  238. }
  239. void SCI_send(unsigned char data)
  240. {
  241.   while(!SCI1SR1_TDRE);       //等待发送数据寄存器(缓冲器)为空
  242.   SCI1DRL = data;
  243. }



  244. /*************************************************************/
  245. /*                  串口发送字符串函数                       */
  246. /*************************************************************/
  247. void send_string(unsigned char *putchar)
  248. {
  249.   while(*putchar!=0x00)       //判断字符串是否发送完毕
  250.   {
  251.    
  252.    SCI_send(*putchar++);  
  253.   }
  254. }

  255. uchar SCI_receive()
  256. {
  257.         uchar a;
  258.         while(!SCI1SR1_RDRF);
  259.         a=SCI1DRL;
  260.         return a;
  261. }



  262. void SCI_sendstring(unsigned char *a,unsigned char stringlen)
  263. {
  264.     unsigned char i;
  265.   for(i=0;i<=stringlen;i++)
  266.         SCI_send(*(a++));
  267. }

  268. unsigned int CRC_Check(unsigned char *Buf, unsigned char crc_count)
  269. {
  270.     unsigned short CRC_Temp;
  271.     unsigned char i,j;
  272.     CRC_Temp = 0xffff;

  273.     for (i=0;i<crc_count; i++)
  274.     {      
  275.         CRC_Temp ^= Buf[i];
  276.         for(j=0;j<8;j++)
  277.         {
  278.             if (CRC_Temp & 0x01)
  279.             CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
  280.             else
  281.             CRC_Temp = CRC_Temp >> 1;
  282.         }
  283.     }
  284.     return(CRC_Temp);
  285. }

  286. void WirelessSerial(int a,int b,int c,int d)
  287. {
  288.   int num;
  289.   unsigned char *data;
  290.   unsigned char nrf_flag = 0,error;
  291.   int *pdat;

  292. #if 1
  293.   num = (int)a;    //Speed
  294.   data = (unsigned char *)&num;
  295.   TxBuf[1] = *data;
  296.   data++;
  297.   TxBuf[0] = *data;
  298.       
  299.   num = (int)b;      //MotorPWM
  300.   data = (unsigned char *)&num;
  301.   TxBuf[3] = *data;
  302.   data++;
  303.   TxBuf[2] = *data;

  304.   num = (int)c;        //angle
  305.   data = (unsigned char *)&num;
  306.   TxBuf[5] = *data;
  307.   data++;
  308.   TxBuf[4] = *data;
  309.   
  310.   num = (int)d;
  311.   data = (unsigned char *)&num;
  312.   TxBuf[7] = *data;
  313.   data++;
  314.   TxBuf[6] = *data;
  315. #endif

  316.   num = CRC_Check(TxBuf,8);
  317.   TxBuf[8] = num & 0xFF;
  318.   TxBuf[9] = num >> 8;

  319.   SCI_sendstring(TxBuf,9);
  320. }

  321. void main(void)
  322. {
  323.   DisableInterrupts;
  324.    
  325.   INIT_PLL();
  326.   
  327.   INIT_IIC();
  328.   
  329.   SCI_Init();
  330.   
  331.   InitL3G4200D();
  332.   
  333.   EnableInterrupts;

  334.   for(;;)
  335.   {
  336.       
  337.       BUF[0]= Single_ReadL3G4200D(OUT_X_L);
  338.       BUF[1]= Single_ReadL3G4200D(OUT_X_H);
  339.       dis_data1=(BUF[1]<<8)+BUF[0];
  340.   
  341.       
  342.       BUF[2]= Single_ReadL3G4200D(OUT_Y_L);
  343.       BUF[3]= Single_ReadL3G4200D(OUT_Y_H);
  344.       dis_data2=(BUF[3]<<8)+BUF[2];
  345.       
  346.       
  347.       BUF[4]= Single_ReadL3G4200D(OUT_Z_L);
  348.       BUF[5]= Single_ReadL3G4200D(OUT_Z_H);
  349.       dis_data3=(BUF[5]<<8)+BUF[4];
  350.       
  351.             
  352.       WirelessSerial(dis_data1,0,0,0);
  353.       
  354.       
  355.      
  356.       
  357.       
  358.   }
  359. }
复制代码


MMA7451的例程,你只需要找到PN532的相关地址改下就ok了
回复

使用道具 举报

地板
ID:143203 发表于 2017-1-2 09:16 | 只看该作者
没有头文件?
回复

使用道具 举报

5#
ID:225305 发表于 2018-8-9 21:22 | 只看该作者
qq多少?
回复

使用道具 举报

6#
ID:881610 发表于 2021-2-4 12:19 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表