#include #include #include #include #include #include #include #include #include #include #include /* set_dac.c * * Func: set_dac.c uses the RTS and DTR pins of a serial device found at /dev/ttyS1 to * set the power levels of the DAC. * DTR is used as the clock signal SCL * RTS is used as the data signal SDA * Please refer to the Max521 specs page for more information on SCL, SDA. * * Usage: set_dac * should be between 0-15 and indicate which dac to set. * should be between 0-255 and indicate the power level to set. * * Author: Wonsop Sim * * Date: July 28, 2004 */ //implements a microsecond delay by reading from a slow I/O port. void delay (int count) { volatile int x; int i; for(i=0; i= 0 && dac_arg < 8) { dac_adr = 0; dac_num = dac_arg;} else if (dac_arg >= 8 && dac_arg < 16) { dac_adr = 3; dac_num = dac_arg - 8;} else { fprintf(stderr, "DAC address must be in range 0-15\n"); exit(1);} if (pow_lvl < 0 || pow_lvl > 255) { fprintf(stderr, "Power level must be in range 0-255\n"); exit(1);} //add in factory set bits to the address dac_adr = (dac_adr * 2) + 80; //open the device if ((fd = open("/dev/ttyS1", O_RDWR | O_NDELAY)) < 0) { fprintf(stderr, "device not found"); exit(1);} //enable I/O port controls iopl(3); //get line bits for serial port ioctl(fd, TIOCMGET, &flags); //make sure RTS and DTR lines are high flags &= ~TIOCM_RTS; flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); //do start condition flags |= TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); flags |= TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); //do address byte for (i = 7; i >=0; i--) { if ((dac_adr >> i) & 1) flags &= ~TIOCM_RTS; else flags |= TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); flags |= TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); } //acknowledge bit flags |= TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); flags |= TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); //do command byte for (i = 7; i >=0; i--) { if ((dac_num >> i) & 1) flags &= ~TIOCM_RTS; else flags |= TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); flags |= TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); } //acknowledge bit flags |= TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); flags |= TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); //do output byte for (i = 7; i >=0; i--) { if ((pow_lvl >> i) & 1) flags &= ~TIOCM_RTS; else flags |= TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); flags |= TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); } //acknowledge bit flags |= TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); flags |= TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); //do stop condition flags &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &flags); delay(count); flags &= ~TIOCM_RTS; ioctl(fd, TIOCMSET, &flags); delay(count); close(fd); return 0; }