[转帖]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。
希望这些能解决你的问题。
发表时间:2014年8月5日15:51:23