搜索
bottom↓
回复: 2

IO口IIC读出来的数据一直为0xFF?

[复制链接]

出0入0汤圆

发表于 2012-7-21 18:20:26 | 显示全部楼层 |阅读模式
本帖最后由 szdream2011 于 2012-7-21 18:21 编辑

用IO口模拟IIC读电容屏坐标,读出来的数据一直为0xFF呢,查了好久不知道怎么 回事,各位帮忙看看问题出在哪!

  1. [size=6][size=5][size=7]#define DELAY_TIME  50

  2. BYTE SDA_IN(void)
  3. {
  4.     register GPIO *sGpio;
  5.     sGpio = (GPIO *)(GPIO_BASE);

  6.     /* 设置FMS_DAT1为输入模式FGPIO[14] */
  7.     sGpio->Fgpcfg[0] &= 0xbfffbfff;

  8.     sGpio->Fgpdat[0] &= 0xbfffbfff;
  9.    
  10.     if (sGpio->Fgpdat[0] & 0x00004000)
  11.     {
  12.         return 1;
  13.     }
  14.     else
  15.     {
  16.         return 0;
  17.     }
  18. }

  19. void SDA_OUT_HIGH(void)
  20. {
  21.     register GPIO *sGpio;
  22.     sGpio = (GPIO *)(GPIO_BASE);

  23.     /* 设置FMS_DAT1为输出模式FGPIO[14] */
  24.     // sGpio->Fgpcfg[0] |= 0x40004000;
  25.     sGpio->Fgpdat[0] |= 0x40000000;

  26.     sGpio->Fgpdat[0] |= 0x40004000;
  27. }
  28. void SDA_OUT_LOW(void)
  29. {
  30.     register GPIO *sGpio;
  31.     sGpio = (GPIO *)(GPIO_BASE);

  32.     /* 设置FMS_DAT1为输出模式FGPIO[14] */
  33.     //sGpio->Fgpcfg[0] |= 0x40004000;
  34.     sGpio->Fgpdat[0] |= 0x40000000;

  35.     sGpio->Fgpdat[0] &= 0xffffbfff;
  36. }
  37. void SCL_OUT_HIGH(void)
  38. {
  39.     register GPIO *sGpio;
  40.     sGpio = (GPIO *)(GPIO_BASE);

  41.     /* 设置FMS_DAT1为输出模式FGPIO[16] */
  42.     //sGpio->Fgpcfg[1] |= 0x00010001;
  43.     sGpio->Fgpdat[1] |= 0x00010001;

  44.     sGpio->Fgpdat[1] |= 0x00000001;
  45. }
  46. void SCL_OUT_LOW(void)
  47. {
  48.     register GPIO *sGpio;
  49.     sGpio = (GPIO *)(GPIO_BASE);

  50.     /* 设置FMS_DAT3为输出模式FGPI1[16] */
  51.     //sGpio->Fgpcfg[1] |= 0x00010001;
  52.     sGpio->Fgpdat[1] |= 0x00010001;

  53.     sGpio->Fgpdat[1] &= 0xfffffffe;
  54. }
  55. /*********************************************************
  56. **函数名:Start_I2C
  57. **功能:启动总线
  58. **输入参数:无
  59. **返回值:无
  60. **********************************************************
  61. */
  62. void Start_I2C(void)
  63. {
  64.     SDA_OUT_HIGH();    /* 发送起始条件的数据信号 */
  65.     IODelay(DELAY_TIME);
  66.     SCL_OUT_HIGH();
  67.     IODelay(DELAY_TIME);

  68.     SDA_OUT_LOW();     /* 发送起始信号 */
  69.     IODelay(DELAY_TIME);
  70.     SCL_OUT_LOW();
  71.     IODelay(DELAY_TIME);
  72. }
  73. /*********************************************************
  74. **函数名:Stop_I2C
  75. **功能:停止总线
  76. **输入参数:无
  77. **返回值:无
  78. **********************************************************
  79. */
  80. void Stop_I2C(void)
  81. {
  82.     SDA_OUT_LOW();     /* 发送结束条件的数据信号 */
  83.     IODelay(DELAY_TIME);

  84.     SCL_OUT_HIGH();    /* 发送I2C总线结束信号 */
  85.     IODelay(DELAY_TIME);
  86.     SDA_OUT_HIGH();
  87.     IODelay(DELAY_TIME);
  88. }
  89. /*********************************************************
  90. **函数名:SendByte
  91. **功能:数据发送函数,单字节发送
  92. **输入参数:bData----数据值
  93. **返回值:无
  94. **********************************************************
  95. */
  96. void SendByte(BYTE bData)
  97. {
  98.     BYTE bCount = 0;

  99.     for (bCount=0; bCount<8; bCount++) /* 要传送的数据长度为8位 */
  100.     {
  101.         bData <<= 1;
  102.         if (bData & 0x80)
  103.         {
  104.             SDA_OUT_HIGH();     /* 判断发送位 */
  105.         }
  106.         else
  107.         {
  108.             SDA_OUT_LOW();
  109.         }
  110.         bData <<= 1;
  111.         IODelay(DELAY_TIME);
  112.         SCL_OUT_HIGH();         /* 置时钟线为高,通知被控制器开始接收数据 */
  113.         IODelay(DELAY_TIME);
  114.     }
  115.     SCL_OUT_LOW();
  116.     /*IODelay(DELAY_TIME);
  117.   

  118.     if (SDA_IN() == 1) bAck = 0; /* 判断是否接收到应答信号 */
  119.     /*else bAck = 1;
  120.     SCL_OUT_LOW();
  121.     IODelay(DELAY_TIME);*/
  122. }
  123. /*********************************************************
  124. **函数名:RecvByte
  125. **功能:接收从器件传回的数据
  126. **输入参数:无
  127. **返回值:接收到的数据
  128. **********************************************************
  129. */
  130. BYTE RecvData(void)
  131. {
  132.     BYTE bRecvData = 0;
  133.     BYTE bCount;

  134.     //SCL_OUT_LOW();
  135.     //IODelay(DELAY_TIME);
  136.     SDA_OUT_HIGH();           /* 置数据线为输入方式 */
  137.     IODelay(DELAY_TIME);
  138.    
  139.     for (bCount=0; bCount<8; bCount++)
  140.     {
  141.         SCL_OUT_HIGH();
  142.         IODelay(DELAY_TIME);
  143.         bRecvData = (bRecvData<<1)|(SDA_IN());
  144.         SCL_OUT_LOW();
  145.         IODelay(DELAY_TIME);
  146.     }
  147.     return bRecvData;
  148. }

  149. void Ack_IIC(BYTE bAck)
  150. {
  151.    SCL_OUT_LOW();
  152.    IODelay(DELAY_TIME);
  153.    if (bAck)
  154.    {
  155.      SDA_OUT_HIGH();
  156.    }
  157.    else
  158.    {
  159.      SDA_OUT_LOW();
  160.    }
  161.    IODelay(DELAY_TIME);
  162.    SCL_OUT_HIGH();
  163.    IODelay(DELAY_TIME);
  164.    SCL_OUT_LOW();
  165.    IODelay(DELAY_TIME);
  166.    SDA_OUT_LOW();
  167.    IODelay(DELAY_TIME);
  168. }

  169. void NoAck_IIC(void)
  170. {
  171.     SCL_OUT_LOW();
  172.     IODelay(DELAY_TIME);
  173.     SDA_OUT_HIGH();
  174.     IODelay(DELAY_TIME);
  175.     SCL_OUT_HIGH();
  176.     IODelay(DELAY_TIME);
  177.     SCL_OUT_LOW();
  178.     IODelay(DELAY_TIME);
  179. }
  180. BYTE I2C_WaitAck(void)
  181. {
  182.     SCL_OUT_HIGH();
  183.     if (SDA_IN())
  184.     {
  185.         SCL_OUT_LOW();
  186.         IODelay(DELAY_TIME);
  187.         SCL_OUT_HIGH();

  188.         if (SDA_IN() == 1)
  189.         {
  190.              return 1;
  191.         }
  192.     }
  193.     else
  194.     {
  195.         return 0;
  196.     }
  197. }
  198. /*********************************************************
  199. **函数名:IIC_Read_Data
  200. **功能:从IIC_Read_Data地址读入n个字节数据  
  201. **输入参数:bAddr    ----写入器件地址
  202. **         pbData   ----写入数据指针
  203. **返回值:读取数据成功与否标志,1:成功,0:失败
  204. **********************************************************
  205. */
  206. BYTE IIC_Read_Data(BYTE bSlaveAddr, BYTE bSubAddr, BYTE *pbData, BYTE bLen)
  207. {
  208.     Start_I2C();
  209.     SendByte(0x70);
  210.     if (I2C_WaitAck())
  211.     {
  212.         mpDebugPrint("1bAck == 0\n");
  213.         Stop_I2C();
  214.         return 0;
  215.     }
  216.    
  217.     SendByte(0xf9);
  218.     if (I2C_WaitAck())
  219.     {
  220.         mpDebugPrint("2bAck == 0\n");
  221.         Stop_I2C();
  222.         return 0;
  223.     }
  224.     Stop_I2C();

  225.     Start_I2C();
  226.     SendByte(0x71);
  227.     if (I2C_WaitAck())
  228.     {
  229.         mpDebugPrint("3bAck == 0\n");
  230.         Stop_I2C();
  231.         return 0;
  232.     }
  233.    
  234.     while(bLen != 1)
  235.     {
  236.         *pbData = RecvData();
  237.         Ack_IIC(0);
  238.         pbData++;
  239.         bLen--;
  240.     }
  241.    
  242.     *pbData = RecvData();
  243.     Ack_IIC(1);
  244.     Stop_I2C();
  245.     return 1;
  246. }[/size][/size][/size]
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-7-23 09:36:12 | 显示全部楼层
顶一个。

出0入0汤圆

发表于 2012-7-23 15:54:05 | 显示全部楼层
搞过几下数字收音机,不会那么呀
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 17:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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