[ARM7] 写了一个AT91SAM7S的IIC代码,跟传感器通信,请各位大神帮帮忙分析一下问题,感激啊

[复制链接]
2123|4
 楼主| zxqhbd 发表于 2013-9-25 09:06 | 显示全部楼层 |阅读模式
AT91SAM7S256芯片与温度传感器的I2C通信,我向传感器的寄存器写值,并把它读出来,但不知道为什么,我用的是KEIL 4,单步调试有问题,程序执行调用函数时,调用完子函数后,它返回不了原来的地方,而是继续往子函数下执行,是我代码有问题吗?请各位帮忙分析一下,我新手刚学,快焦头烂额了,谢谢各位好心人啊。。。。
  1. init_twi(void)
  2. {

  3.         // Configure PIO controllers to periph mode, in open drain
  4.         AT91F_TWI_CfgPIO();        
  5.         AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,AT91C_PA3_TWD | AT91C_PA4_TWCK);
  6.        
  7.         // AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
  8.         AT91F_TWI_CfgPMC();

  9.         AT91F_TWI_DisableIt(AT91C_BASE_TWI,0xFFFFFFFF);                     // Disable TWI IT
  10.         AT91F_TWI_Configure(AT91C_BASE_TWI);                        // Configure TWI in master mode
  11. }

  12. uint32_t MLX620_I2C_Driver_WriteRead(AT91PS_TWI pTWI,uint8_t *pWriteData,uint8_t *pReadData)
  13. {
  14.   int i;       
  15.    AT91C_BASE_TWI->TWI_CWGR = 0x40f0f;
  16.         pTWI->TWI_CR = AT91C_TWI_MSEN;               
  17.         pTWI->TWI_MMR = (AT91C_TWI_IADRSZ_NO  | (!AT91C_TWI_MREAD) | AT91C_TWI_DADR); //AT91C_TWI_DADR已经为从器件的地址了
  18.         pTWI->TWI_IADR = 0x0;                                //INTERNAL ADDRESS
  19.         pTWI->TWI_THR =*pWriteData++;

  20.         pTWI->TWI_CR = AT91C_TWI_START;                             //start
  21.         while(pTWI->TWI_SR&0x4==0 ){};
  22.         for(i=0;i<3;i++){
  23.         pTWI->TWI_THR=*pWriteData++;
  24.          while(pTWI->TWI_SR&0x4==0 ){};
  25.          }
  26.         // must have a short delay when corresponding to the at24c02
  27.         time_dly(100);                                       
  28.         //pTWI->TWI_CR = AT91C_TWI_STOP ;                            //stop
  29. //        while(pTWI->TWI_SR&0x1==0){};       
  30.        
  31.        
  32.        
  33.        
  34.         AT91C_BASE_TWI->TWI_CWGR = 0x40f0f;
  35.         AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN ;
  36.         pTWI->TWI_MMR = (AT91C_TWI_IADRSZ_NO  | AT91C_TWI_MREAD | AT91C_TWI_DADR);
  37.        
  38.         pTWI->TWI_IADR = 0x0;                                     //INTERNAL ADDRESS
  39.         pTWI->TWI_CR |= AT91C_TWI_START;                                //start

  40.         while((pTWI->TWI_SR & 0x2) == 0 ){};
  41.         *pReadData++ = pTWI->TWI_RHR;
  42.         // must have a short delay when corresponding to the at24c02
  43.         time_dly(100);

  44.         pTWI->TWI_CR |= AT91C_TWI_STOP;                                    //stop
  45.         while((pTWI->TWI_SR & 0x1) == 0){};
  46.         }
  47.        



  48. uint32_t MLX620_I2C_Driver_Write(AT91PS_TWI pTWI, uint8_t *pData)
  49. {
  50. int i;
  51. AT91C_BASE_TWI->TWI_CWGR = 0x40f0f;
  52.         pTWI->TWI_CR = AT91C_TWI_MSEN;               
  53.         pTWI->TWI_MMR = (AT91C_TWI_IADRSZ_NO  | (!AT91C_TWI_MREAD) | AT91C_TWI_DADR); //AT91C_TWI_DADR已经为从器件的地址了
  54.         pTWI->TWI_IADR = 0x0;                                //INTERNAL ADDRESS
  55.         pTWI->TWI_THR =*pData++;

  56.         pTWI->TWI_CR = AT91C_TWI_START;
  57.         while(pTWI->TWI_SR&0x4==0 )
  58.         {
  59.         };
  60.         for(i=0;i<4;i++){                             //start
  61.         pTWI->TWI_THR =*pData++;
  62.         while(pTWI->TWI_SR&0x4==0 )
  63.         {
  64.         };
  65.         }
  66.         // must have a short delay when corresponding to the at24c02
  67.         time_dly(100);                                       
  68.         pTWI->TWI_CR = AT91C_TWI_STOP ;                            //stop
  69.         while(pTWI->TWI_SR&0x1==0){};
  70.         }


  71. uint8_t MLX620_ReadRAM(uint8_t startAddr,
  72.                         uint8_t addrStep,
  73.                         uint8_t nWords,
  74.                         uint8_t *pData)
  75. {
  76.   uint8_t writeBuffer[] = {MLX620_CMD_READ,0,0,0};
  77.                         writeBuffer[1]=startAddr;
  78.                         writeBuffer[2]=addrStep;
  79.                         writeBuffer[3]=nWords;

  80.   return MLX620_I2C_Driver_WriteRead(AT91C_BASE_TWI,writeBuffer, pData);
  81. }

  82. uint8_t MLX620_WriteTrim(uint16_t trimReg)
  83. {
  84.   uint8_t pOut[] = {MLX620_CMD_WRITE_TRIM,0,0,0,0};
  85.       pOut[1]=(uint8_t)((trimReg & 0xFF) - 0xAA);
  86.       pOut[2]=(uint8_t)(trimReg & 0xFF);
  87.       pOut[3]=(uint8_t)((trimReg >> 8) - 0xAA);
  88.       pOut[4]=(uint8_t)(trimReg >> 8);

  89.    MLX620_I2C_Driver_Write(AT91C_BASE_TWI,pOut);
  90. }

  91. uint8_t MLX620_ReadTrim (uint16_t *pTrimReg)
  92. {
  93.   return (MLX620_ReadRAM(MLX620_RAM_TRIM,
  94.                          0,
  95.                          sizeof(uint16_t),
  96.                          (uint8_t*)pTrimReg));
  97. }

  98. int main()
  99. {
  100. uint16_t *trim;
  101. init_twi();
  102. MLX620_WriteTrim(0x740E);
  103. MLX620_ReadTrim(trim);
  104. do
  105. {
  106. }while(1);
  107. }
 楼主| zxqhbd 发表于 2013-9-25 09:35 | 显示全部楼层
自己顶啊,求各位好心人帮帮忙
 楼主| zxqhbd 发表于 2013-9-25 18:51 | 显示全部楼层
玩AT91SAM7S系列的大神,帮忙分析一下啊,自己顶一个
 楼主| zxqhbd 发表于 2013-9-27 15:22 | 显示全部楼层
求帮忙看看啊
yonghe 发表于 2014-12-31 14:24 | 显示全部楼层
你用AT91SAM7S256?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部