mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-22 03:40:04 +02:00
246 lines
4.1 KiB
C
246 lines
4.1 KiB
C
#include "firmware_funcs.h"
|
|
#include "registers_m.h"
|
|
#include "server_defs.h"
|
|
#include "blackfin.h"
|
|
|
|
int prepareSlowADCSeq() {
|
|
|
|
// u_int16_t vv=0x3c40;
|
|
u_int16_t codata=( 1<<13) | (7<<10) | (7<<7) | (1<<6) | (0<<3) | (2<<1) | 1;
|
|
|
|
u_int32_t valw;
|
|
int obit, ibit;
|
|
|
|
// int cnv_bit=16, sdi_bit=17, sck_bit=18;
|
|
int cnv_bit=10, sdi_bit=8, sck_bit=9;
|
|
|
|
// int oval=0;
|
|
|
|
|
|
printf("Codata is %04x\n",codata);
|
|
|
|
/* //convert */
|
|
valw=(1<<cnv_bit);
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
usleep(20);
|
|
|
|
valw=0;
|
|
bus_w(ADC_WRITE_REG,(valw));
|
|
|
|
usleep(20);
|
|
|
|
for (ibit=0; ibit<14; ibit++) {
|
|
obit=((codata >> (13-ibit)) & 1);
|
|
// printf("%d",obit);
|
|
valw = obit << sdi_bit;
|
|
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
usleep(20);
|
|
|
|
bus_w(ADC_WRITE_REG,valw|(1<<sck_bit));
|
|
|
|
usleep(20);
|
|
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
}
|
|
// printf("\n");
|
|
|
|
|
|
|
|
bus_w(ADC_WRITE_REG,0);
|
|
|
|
/* //convert */
|
|
valw=(1<<cnv_bit);
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
usleep(20);
|
|
|
|
valw=0;
|
|
bus_w(ADC_WRITE_REG,(valw));
|
|
|
|
usleep(20);
|
|
return 0;
|
|
|
|
}
|
|
|
|
int prepareSlowADC(int ichan) {
|
|
|
|
// u_int16_t vv=0x3c40;
|
|
// u_int16_t codata=( 1<<13) | (7<<10) | (7<<7) | (1<<6) | (0<<3) | (2<<1) | 1;
|
|
|
|
u_int16_t codata=(1<<13) | (7<<10) | (ichan<<7) | (1<<6) | (0<<3) | (0<<1) | 1; //read single channel
|
|
if (ichan<0) codata=( 1<<13) | (3<<10) | (7<7) | (1<<6) | (0<<3) | (0<<1) | 1;
|
|
|
|
u_int32_t valw;
|
|
int obit, ibit;
|
|
|
|
// int cnv_bit=16, sdi_bit=17, sck_bit=18;
|
|
int cnv_bit=10, sdi_bit=8, sck_bit=9;
|
|
|
|
|
|
// int oval=0;
|
|
|
|
|
|
printf("Codata is %04x\n",codata);
|
|
|
|
/* //convert */
|
|
valw=(1<<cnv_bit);
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
usleep(20);
|
|
|
|
valw=0;
|
|
bus_w(ADC_WRITE_REG,(valw));
|
|
|
|
usleep(20);
|
|
|
|
for (ibit=0; ibit<14; ibit++) {
|
|
obit=((codata >> (13-ibit)) & 1);
|
|
// printf("%d",obit);
|
|
valw = obit << sdi_bit;
|
|
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
usleep(20);
|
|
|
|
bus_w(ADC_WRITE_REG,valw|(1<<sck_bit));
|
|
|
|
usleep(20);
|
|
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
}
|
|
// printf("\n");
|
|
|
|
|
|
|
|
bus_w(ADC_WRITE_REG,0);
|
|
|
|
/* //convert */
|
|
valw=(1<<cnv_bit);
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
usleep(20);
|
|
|
|
valw=0;
|
|
bus_w(ADC_WRITE_REG,(valw));
|
|
|
|
usleep(20);
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int readSlowADC(int ichan) {
|
|
|
|
|
|
// u_int16_t vv=0x3c40;
|
|
// u_int16_t codata=( 1<<13) | (7<<10) | (ichan<<7) | (1<<6) | (0<<3) | (0<<1) | 1; //read single channel
|
|
|
|
u_int32_t valw;
|
|
int i, obit;
|
|
|
|
|
|
|
|
// int cnv_bit=16, sdi_bit=17, sck_bit=18;
|
|
int cnv_bit=10, sdi_bit=8, sck_bit=9;
|
|
|
|
int oval=0;
|
|
|
|
printf("DAC index is %d\n",ichan);
|
|
|
|
if (ichan<-1 || ichan>7)
|
|
return -1;
|
|
|
|
|
|
prepareSlowADC(ichan);
|
|
|
|
|
|
/* printf("Codata is %04x\n",codata); */
|
|
|
|
/* /\* //convert *\/ */
|
|
/* valw=(1<<cnv_bit); */
|
|
/* bus_w(ADC_WRITE_REG,valw); */
|
|
|
|
/* usleep(20); */
|
|
|
|
/* valw=0; */
|
|
/* bus_w(ADC_WRITE_REG,(valw)); */
|
|
|
|
/* usleep(20); */
|
|
|
|
/* for (ibit=0; ibit<14; ibit++) { */
|
|
/* obit=((codata >> (13-ibit)) & 1); */
|
|
/* // printf("%d",obit); */
|
|
/* valw = obit << sdi_bit; */
|
|
|
|
/* bus_w(ADC_WRITE_REG,valw); */
|
|
|
|
/* usleep(20); */
|
|
|
|
/* bus_w(ADC_WRITE_REG,valw|(1<<sck_bit)); */
|
|
|
|
/* usleep(20); */
|
|
|
|
/* bus_w(ADC_WRITE_REG,valw); */
|
|
|
|
/* } */
|
|
/* // printf("\n"); */
|
|
|
|
|
|
|
|
/* bus_w(ADC_WRITE_REG,0); */
|
|
|
|
|
|
|
|
|
|
|
|
for (ichan=0; ichan<9; ichan++) {
|
|
|
|
|
|
/* //convert */
|
|
valw=(1<<cnv_bit);
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
|
|
usleep(20);
|
|
|
|
valw=0;
|
|
bus_w(ADC_WRITE_REG,(valw));
|
|
|
|
|
|
usleep(20);
|
|
// printf("Channel %d ",ichan);
|
|
//read
|
|
oval=0;
|
|
for (i=0;i<16;i++) {
|
|
obit=bus_r16(SLOW_ADC_REG)&0x1;
|
|
// printf("%d",obit);
|
|
//write data (i)
|
|
// usleep(0);
|
|
oval|=obit<<(15-i);
|
|
//cldwn
|
|
valw=0;
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
bus_w(ADC_WRITE_REG,valw|(1<<sck_bit));
|
|
usleep(20);
|
|
bus_w(ADC_WRITE_REG,valw);
|
|
usleep(20);
|
|
|
|
|
|
}
|
|
printf("\t");
|
|
printf("Value %d is %d (%d mV)\n",ichan, oval,2500*oval/65535);
|
|
|
|
}
|
|
|
|
printf("Value %d is %d\n",ichan, oval);
|
|
|
|
return 2500*oval/65535;
|
|
}
|
|
|