void main(void) { int i = 0; volatile uint16_t dataA = 0; volatile uint16_t dataB = 0; /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; /* Select OCP_CLK as IEP clock source */ CT_CFG.IEPCLK_bit.OCP_EN = 0x1; iep_timer_config(); intc_config(); CT_IEP.TMR_GLB_CFG_bit.CNT_EN = 0x1; /* Setting PRU1 GPO Clk Dividers to 12.5 and 2 to get 8 MHz CLK */ CT_CFG.GPCFG1_bit.PRU1_GPO_DIV0 = 0x17; CT_CFG.GPCFG1_bit.PRU1_GPO_DIV1 = 0x02; /* Init the configure registers and put them in shift out mode */ CT_CFG.GPCFG1_bit.PRU1_GPO_MODE = PRU1_GPO_MODE_SERIAL; /* Init PRU1 GPO to 0 */ __R30 = 0x0; SH0_Load(0); SH1_Load(0); /* Enable PRU1 GPO shift out */ __R30 |= SHIFT_ENABLE_FLAG << SHIFT_ENABLE_SHIFT; while (1) { for (i = 0; i < 0xFF; i++) { /* Poll until R31.30 is set */ do { while ((__R31 & 0x40000000) == 0) { } /* Verify that the IEP is the source of the interrupt */ } while (CT_INTC.HIPIR0 != PRU_IEP_EVT); /* Clear Compare0 status */ CT_IEP.TMR_CMP_STS = 0x1; __delay_cycles(2); /* Clear the status of the interrupt */ CT_INTC.SECR0 = (1 << PRU_IEP_EVT); /* Format sine wave data for DAC */ dataA = DAC_Cmd(DAC_A_ADDRESS, WRITE_NO_UPDATE, SineRaw[i]); /* Swap data endian from LSB first to MSB first per DAC format*/ dataA = Endian_Swap(dataA); /* Load data into Shadow Register 0 */ SH0_Load(dataA); while (!(CT_CFG.GPCFG1 & PRU1_GPO_SH_SEL_MASK)); /* Wait for SH Flag to indicate SH0 being output */ while ((CT_CFG.GPCFG1 & PRU1_GPO_SH_SEL_MASK)); /* Generate sync signal */ __R30 |= 0x0004; __delay_cycles(2); __R30 &= ~0x4; /* Format sine wave data for DAC */ dataB = DAC_Cmd(DAC_B_ADDRESS, WRITE_UPDATE, SineRaw[i]); /* Swap data endian from LSB first to MSB first per DAC format */ dataB = Endian_Swap(dataB); /* Load data into Shadow Register 1 */ SH1_Load(dataB); /* Wait for SH Flag to indicate SH1 being output */ while (!(CT_CFG.GPCFG1 & PRU1_GPO_SH_SEL_MASK)); /* Generate sync signal */ __R30 |= 0x0004; __delay_cycles(2); __R30 &= ~0x4; } } }
void main(){ unsigned int status, crc_calc, i, j = 0; char bit_val, byte_val = 0; /* Initialize TEMP_SENSOR_BUF to 0 */ memset(TEMP_SENSOR_BUF, 0, 9); /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */ CT_CFG.SYSCFG_bit.STANDBY_INIT = 0; /* Configure IEP timer */ iep_timer_config(); /* Configure IEP digio */ iep_digio_config(); CT_IEP.DIGIO_DATA_OUT_EN = OUT_1WIRE; /* Interrupt Master PRU */ PRU_SLAVE_MASTER_EVT_TRIGGER; while(1){ /* Detect Master PRU interrupt: Read Temp */ while((__R31 & 0x40000000) == 0){ } /* Clear system event */ CT_INTC.SECR0 = (1 << PRU_MASTER_SLAVE_EVT); /* Issue Convert T command to sensor */ init(); write_cmd(SKIP_ROM); write_cmd(CONVERT_T); while(status == 0){ status = read(); } status = 0; /* Issue Read Scratchpad command to sensor */ init(); write_cmd(SKIP_ROM); write_cmd(READ_SCRATCHPAD); crc_calc = 0; /* Read sensor scratchpad's 9 bytes of data */ for(i=0; i < 9; i++){ byte_val = 0; /* Read 8 bits per byte */ for(j=0; j < 8; j++){ bit_val = read(); byte_val = byte_val | (bit_val << j); } /* Store each byte of data in memory (PRU Shared RAM) */ TEMP_SENSOR_BUF[i] = byte_val; /* Calculate CRC after each byte of data read */ crc_calc = CRC_BYTE_ARRAY[crc_calc ^ byte_val]; } /* Compare CRC values */ /* If CRC value matches, interrupt Master that temp value is ready */ if(crc_calc == 0x0){ PRU_SLAVE_MASTER_EVT_TRIGGER; } /* If CRC value does not match, re-sample temp */ if(crc_calc != 0x0){ PRU_MASTER_SLAVE_EVT_TRIGGER; } } }