Exemple de programme en C écrit dans le microcontrôleur MSP430F169
Ce microcontrôleur dispose de 2 ports SPI.
Mode SPI : Single-bit serial 2-wire mode (default mode)
initialisation et chargement des registres CSR et CFTW0:
int CSR_ADDRESS = 0x00; AD9959 CSR adresss Byte
int CSR_NUM_BYTE = 0x01; CSR nombre d'octet du registre
long CSR0 = 0x10; AD9959 du channel 0 MSB first SPI par défaut
int FTW_ADDRESS = 0x04; AD9959 FTW adresss Byte
int FTW_NUM_BYTE = 0x04; FTW nombre d'octet du registre
long FTW0 = 0x28F5C28F; frequence en hex fout x2^32/fclock
dans le main:
P4OUT = 0x40; AD9959 master reset bit de validation du MSP430 P4OUT = 0x00; AD9959 master set bit de validation du MSP430 write_serial_port(CSR_ADDRESS, CSR0, CSR_NUM_BYTE); P5OUT = 0x40; I/O update du DDS bit de validation du MSP430 P5OUT = 0x00; I/O update du DDS bit de validation du MSP430 write_serial_port(FTW_ADDRESS, FTW0, FTW_NUM_BYTE); P5OUT = 0x40; I/O update du DDS bit de validation du MSP430 P5OUT = 0x00; I/O update du DDS bit de validation du MSP430
Pour initialiser le DDS on applique cette procédure : RESET-DATA_SEND_to_BUFFER-IO_UPDATE.
RESET du DDS (pin 3), on charge les données de chaque registre au travers du port SPI write_serial_port… Puis on réalise un I/O UPDATE pin 46 du DDS pour la validation et le transfert des données. Ce bout de programme permet de charger le channel 0 avec une fréquence de 80MHz et une amplitude par défaut FULL DAC.
I/O_UPDATE is synchronous to the SYNC_CLK (Pin 54) = Master clock/4. Voir figure 40 du datasheet du DDS.
Ci-dessous le sous programme d'initialisation des ports du microcontrôleur et du SPI pour le MSP430F169 : TI fourni de nombreux exemples de codes de bases pour configurer les modes SPI, I2C et utiliser la mémoire Flash: slac015p.zip
void_init_SPI(void)
{
BCSCTL1 |= XTS; ACLK= LFXT1= HF XTAL
BCSCTL2 |= SELM_3; MCLK = LFXT1 (safe) pin 8,9 du MSP430
P1SEL = 0x00; P1 I/O select
P2SEL = 0x00; P2 I/O select
P3SEL = 0x00; P3 I/O select
P4SEL = 0x00; P4 I/O select
P5SEL = 0x0A; P5.1,3 SPI option select
P6SEL = 0x00; P6 I/O select
P1DIR = 0xFF; P1.output direction
P2DIR = 0xFF; P2 output direction
P3DIR = 0xFF; P3 output direction
P4DIR = 0xFF; P4 output direction
P5DIR = 0xFF; P5 output direction
P6DIR = 0xFF; P6 output direction
ME2 |= USPIE1; Enable USART1 SPI
UCTL1 |= CHAR + SYNC + MM; 8-bit SPI Master **SWRST**
UTCTL1 = CKPH + SSEL1 + STC; SMCLK delayed, 3-pin
UBR01 = 0x2; ACLK/2 for baud rate
UBR11 = 0x0; ACLK/2 for baud rate
UMCTL1 = 0x0; Clear modulation
UCTL1 &= ~SWRST; Initialize USART state machine
}
BCSCTL1 |= XTS; et BCSCTL2 |= SELM_3; permet d'être en mode HF XTAL le MSP430 fonctionnera à 8MHz au lieu de 32KHz par défaut.
MSP430F169
-----------------
/|\| XIN|-
| | | HF XTAL (455k - 8Mhz)
--|RST XOUT|-
| |
| P5.4|-->MCLK = XTAL
D'après : M. Buccini Texas Instruments Inc. Feb 2005 Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
la routine pour le chargement des données en mode SPI du MSP430F169 :
void write_serial_port(int instruction, long data, int num_byte)
{
int i=0;
TXBUF1 = instruction;
do
{
TXBUF1 = data >>(num_byte-1-i)*8;
i++;
}
while (i < num_byte);
}
Exemple de programme en C écrit dans le microcontrôleur ARM TM4C123GH6PM
Ce microcontrôleur dispose de 4 ports SPI. Horloge par défaut = 80MHz
Mode SPI : Single-bit serial 3-wire mode
la routine pour le chargement des données en mode SPI de l'ARM TM4C123GH6PM :
int i=0;
SSI0_DR_R = instruction;
while( num_byte )
{
while(!(SSI0_SR_R & SSI_SR_TNF)) {} // SPI0 du TM4C123GH6PM
SSI0_DR_R = data >>(num_byte-1-i)*8;
num_byte--;
}
while( !( SSI0_SR_R & SSI_SR_TNF ) )
{
;
}
La routine init (SPI) pour l'ARM TM4C123GH6PM:
// Enable Peripheral SSI0 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //Enable GPIO port A SSI0. SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PA3_SSI0FSS); GPIOPinConfigure(GPIO_PA5_SSI0TX); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_3 | GPIO_PIN_2); //GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_2); SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 10000000, 8); SSIEnable(SSI0_BASE); // Enable the SSI
Exemple d'initialisation d'un PORT sur l'ARM TM4C123GH6PM:
//void PortB_Init(void) volatile unsigned long delay; SYSCTL_RCGC2_R |= 0x00000002; // 1) activate clock for Port B delay = SYSCTL_RCGC2_R; // allow time for clock to start GPIO_PORTB_AMSEL_R = 0x00; // 3) disable analog on PB GPIO_PORTB_PCTL_R = 0x00000000; // 4) PCTL GPIO on PB0 GPIO_PORTB_DIR_R |= 0xFF; // 5) PB0-PB7 is out //GPIO_PORTB_AFSEL_R &= ~0x01; // 6) disable alt funct on PB0 GPIO_PORTB_AFSEL_R &= ~0xFF; // 6) disable alt funct on PB0-PB7 GPIO_PORTB_DEN_R |= 0xFF; // 7) enable digital I/O on PB0-PB7
Exemple d'initialisation d'un PORT pour la communication série USB-UART0 sur l'ARM TM4C123GH6PM:
//void init_UART0(void)
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
Exemple de déclaration et d'initialisation des registres mot de fréquences:
//AD9852// int FTW0_ADRESS = 0x02; //unsigned long long FTW0 = 0x17E4B17E4B1; //1.75MHz@300MHz clk unsigned long long FTW0; //float FTW0 = 0x17E4B17E4B1; //1.75MHz@300MHz clk int FTW0_NUM_BYTE = 0x06; //AD9858// int FTW1_ADRESS = 0x03; unsigned long FTW1 = 0x418937; //1MHz@1000MHz clk int FTW1_NUM_BYTE = 0x04; //AD9858// int CFR_ADRESS = 0x00; unsigned long CFR = 0x79; // MSB first int CFR_NUM_BYTE = 0x04;