导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[转帖]GPIO ADC Slice&#[liufengzhong]

 *第63770篇: [转帖]GPIO ADC Slice 在 Slice Kit

  
楼 主:liufengzhong 2014年8月5日15:51
 [转帖]GPIO ADC Slice 在 Slice Kit
嘿,我连接gpio adc slice用slicekit遇到麻烦。我似乎无法从任何的ADC的对它读值。

我用一个简单的电位器接口板,并尝试只是发送3.3V到ADC来读任何东西。有一张图附在这个问题关于我对在GPIO slice引脚ADC的理解。

这是我用过的代码(其修改的代码,用于简单的GPIO例子)

n stdcore[0]: struct r_i2c i2cOne = {
  XS1_PORT_1F,
  XS1_PORT_1F,
  1000

};
 
void app_manager() {
  unsigned button_press_1,button_press_2,time,time1;
  int button =1,index=0,toggle=0;
  timer t;
  unsigned char data[1]={0x23};
  unsigned char data1[2];
  int adc_value;
  unsigned led_value=0x0E;
 
  p_PORT_BUT_1:>   button_press_1;
  set_port_drive_low(p_PORT_BUT_1);
 
  //::Write config
  i2c_master_init(i2cOne);
  i2c_master_write_reg(0x28, 0x00, data, 1, i2cOne); //Write configuration information to ADC
 
  //::Config
  t:>  time;
 
  printstrln("** WELCOME TO SIMPLE GPIO DEMO **");
  while(1) {
    //::Select start
    select {
      case button =>   p_PORT_BUT_1 when pinsneq(button_press_1):>   button_press_1: //checks if any button is pressed
        button=0;
        t:>  time;
        break;
     
      //waits for 20ms and checks if the same button is pressed or not
      case !button =>   t when timerafter(time+debounce_time):>  void:
        p_PORT_BUT_1:>   button_press_2;
        if(button_press_1==button_press_2)
        //Button 1 is pressed
        if(button_press_1 == BUTTON_PRESS_value)  {
           printstrln("Button 1 Pressed");
           p_led  <:(led_value);
           led_value=led_value  <  <1;
           led_value|=0x01;
           led_value=led_value & 0x0F;
           if(led_value == 15){
           led_value=0x0E;
         }
       }
      
       //Button 2 is pressed
       if(button_press_1 == BUTTON_PRESS_value-1) {
          data1[0]=0;data1[1]=0;
         
          //Read ADC value using I2C read
          i2c_master_rx(0x29, data1, 2, i2cOne);
         
          data1[0]=data1[0]&0x0F;
          adc_value=(data1[0]  <  <6)|(data1[1]>  >  2);
         
          printstr("value is: ");
          printintln(adc_value);
       }
       button=1;
       break;
      }
   }
}
 
int main(void) {
   par {
      on stdcore[0]: app_manager();
   }
return 0;
}

我始终得出输出
value: 0
value: 0

我想检查每个元素的data1,但这些都是0后读取ADC。

有什么帮助就太好了。

谢谢!

附件:

回答:

Hi,

你用着那个I2C模块?

在你的代码,我发现SDA和SCL线映射到相同的GPIO”xs1_port_1f”。如果你用着module_i2c_master,然后structure r_i2c里有下面的原理。

typedef struct r_i2c {
    port scl;      /**  < Port on which clock wire is attached. Must be on bit 0 */
    port sda;      /**  < Port on which data wire is attached. Must be on bit 0 */
    unsigned int clockTicks; /**  < Number of reference clocks per I2C clock,
                              *   set to 1000 for 100 Khz. */
}  r_i2c;

所以你的代码应该有一些东西像

struct r_i2c i2cOne = {
    XS1_PORT_1F,
    XS1_PORT_1B,
    1000,
};

在做“i2c_master_rx”也没有必要改变从地址0x29在做“i2c_master_rx”。函数本身增加了readbit。

希望这些能解决你的问题。



>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:在线语音研讨会:贱金属浆料在电子电路和元件行业中的应用

[下一篇主题]:[转帖]为我的项目添加Third parties Static lib