Пример #1
0
Файл: spi.c Проект: 42wim/ipxe
/**
 * Write data to SPI device
 *
 * @v nvs		NVS device
 * @v address		Address from which to read
 * @v data		Data buffer
 * @v len		Length of data buffer
 * @ret rc		Return status code
 */
int spi_write ( struct nvs_device *nvs, unsigned int address,
		const void *data, size_t len ) {
	struct spi_device *device = nvs_to_spi ( nvs );
	struct spi_bus *bus = device->bus;
	unsigned int command = spi_command ( SPI_WRITE, address,
					     device->munge_address );
	int rc;

	DBG ( "SPI %p writing %zd bytes to %#04x\n", device, len, address );

	if ( ( rc = bus->rw ( bus, device, SPI_WREN, -1,
			      NULL, NULL, 0 ) ) != 0 ) {
		DBG ( "SPI %p failed to write-enable device\n", device );
		return rc;
	}

	if ( ( rc = bus->rw ( bus, device, command, address,
			      data, NULL, len ) ) != 0 ) {
		DBG ( "SPI %p failed to write data to device\n", device );
		return rc;
	}
	
	if ( ( rc = spi_wait ( device ) ) != 0 ) {
		DBG ( "SPI %p failed to complete write operation\n", device );
		return rc;
	}

	return 0;
}
Пример #2
0
uint8_t spi_send(uint8_t b) {
    uint8_t reply;
    SPDR=b;
    spi_wait();
    reply = SPDR;
    return reply;
}
Пример #3
0
Файл: hal_spi.c Проект: gxp/node
int8 spi_get(TiSpiAdapter * spi, char * pc )
{
    if(spi->id == 0)
    {
		SPI_SPDR = 0; 
        spi_wait(spi); 
        *pc = SPI_SPDR; 
	}
    if(spi->id == 1)
    {
		SSPDR = 0;
        spi_wait(spi);
        *pc = SSPDR; 	
	}
        
    return 0;
}
Пример #4
0
void spi_send_byte(BYTE data)
{
	#asm
	ld	hl, 2
	add	hl, sp
	ld	a, (hl)
	out ($c1),a
	#endasm
	spi_wait();
}
Пример #5
0
uint32_t spi_transact(bool readback, int slave, uint32_t data, int length, uint32_t flags)
{
    uint32_t control_word = 0;
    control_word |= (slave << SPI_CORE_SLAVE_SELECT_SHIFT);
    control_word |= (length << SPI_CORE_NUM_BITS_SHIFT);
    if ((flags & SPI_PUSH_RISE)  != 0) control_word |= (1 << SPI_CORE_DATA_OUT_EDGE_SHIFT);
    if ((flags & SPI_PUSH_FALL)  != 0) control_word |= (0 << SPI_CORE_DATA_OUT_EDGE_SHIFT);
    if ((flags & SPI_LATCH_RISE) != 0) control_word |= (1 << SPI_CORE_DATA_IN_EDGE_SHIFT);
    if ((flags & SPI_LATCH_FALL) != 0) control_word |= (0 << SPI_CORE_DATA_IN_EDGE_SHIFT);

    const uint32_t data_out = data << (32 - length);

    spi_wait();
    spi_core->control = control_word;
    spi_core->data = data_out;

    if (!readback) return 0;

    spi_wait();
    return readback_mux->spi;
}
Пример #6
0
uint8_t mcp2515_read_id(uint32_t *id)
{
	uint8_t first;
	uint8_t tmp;
	
	first = spi_putc(0xff);
	tmp   = spi_putc(0xff);
	
	if (tmp & (1 << IDE)) {
		spi_start(0xff);
		
		*((uint16_t *) id + 1)  = (uint16_t) first << 5;
		*((uint8_t *)  id + 1)  = spi_wait();
		spi_start(0xff);
		
		*((uint8_t *)  id + 2) |= (tmp >> 3) & 0x1C;
		*((uint8_t *)  id + 2) |=  tmp & 0x03;
		
		*((uint8_t *)  id)      = spi_wait();
		
		return TRUE;
	}
Пример #7
0
Файл: hal_spi.c Проект: gxp/node
uint8 spi_put(TiSpiAdapter * spi, char ch )
{
	uint8 ret = 0;
	
	#ifdef GDEBUG
	//uart_write( g_uart, "spi_put:\r\n", 10, 0x00 );
	#endif
	
    if (spi->id == 0)
    {
    	// SPI_SPSR; // clear all the flags
		SPI_SPDR = ch; 
        spi_wait(spi);
        ret = SPI_SPDR; 
	}
    else if (spi->id == 1)
    {
		SSPDR = ch;
        spi_wait(spi);	
        ret = SSPDR; 
	}
	
	return ret;
}
Пример #8
0
int
spi_send(struct spi_handle *sh, int cnt, const uint8_t *data)
{
	struct spi_transfer	trans;
	struct spi_chunk	chunk;

	spi_transfer_init(&trans);
	spi_chunk_init(&chunk, cnt, data, NULL);
	spi_transfer_add(&trans, &chunk);

	/* enqueue it and wait for it to complete */
	spi_transfer(sh, &trans);
	spi_wait(&trans);

	if (trans.st_flags & SPI_F_ERROR)
		return trans.st_errno;

	return 0;
}
Пример #9
0
uint8_t spi_send(uint8_t b) {
	uint8_t reply;
#ifdef ISP_LOW_SPEED
	cli();
	CLKPR = B10000000;
	CLKPR = B00000011;
	sei();
#endif
	SPDR = b;
	spi_wait();
	reply = SPDR;
#ifdef ISP_LOW_SPEED
	cli();
	CLKPR = B10000000;
	CLKPR = B00000000;
	sei();
#endif
	return reply;
}
void mcp2515_write_id(const uint32_t *id, uint8_t extended)
{
	uint8_t tmp;
	
	if (extended) {
		spi_start(*((uint16_t *) id + 1) >> 5);
		
		// naechsten Werte berechnen
		tmp  = (*((uint8_t *) id + 2) << 3) & 0xe0;
		tmp |= (1 << IDE);
		tmp |= (*((uint8_t *) id + 2)) & 0x03;
		
		// warten bis der vorherige Werte geschrieben wurde
		spi_wait();
		
		// restliche Werte schreiben
		spi_putc(tmp);
		spi_putc(*((uint8_t *) id + 1));
		spi_putc(*((uint8_t *) id));
	}
	else {
Пример #11
0
int
spi_send_recv(struct spi_handle *sh, int scnt, const uint8_t *snd,
    int rcnt, uint8_t *rcv)
{
	struct spi_transfer	trans;
	struct spi_chunk	chunk1, chunk2;

	spi_transfer_init(&trans);
	spi_chunk_init(&chunk1, scnt, snd, NULL);
	spi_chunk_init(&chunk2, rcnt, NULL, rcv);
	spi_transfer_add(&trans, &chunk1);
	spi_transfer_add(&trans, &chunk2);

	/* enqueue it and wait for it to complete */
	spi_transfer(sh, &trans);
	spi_wait(&trans);

	if (trans.st_flags & SPI_F_ERROR)
		return trans.st_errno;

	return 0;
}
Пример #12
0
void rtc_send(uint8_t b) {
    PORTD &= ~_BV(6);
    SPDR = b;
    spi_wait();
}
Пример #13
0
void spi_send(uint8_t b) 
{
    SPDR = b;
    spi_wait();
}
Пример #14
0
return_value_t loadcell_init()
{
	unsigned i;
	loadcell_state.init_return = RET_OK;
	for (i = 0; i < 4; ++i) {
		loadcell_state.values[i] = 0l;
		loadcell_state.num_measurements[i] = 0;
	}

	SHD = 1;

	IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
	IEC0bits.SPI1IE = 0; // Disable the Interrupt

	// SPI1CON1 Register Settings
	SPI1CON1bits.DISSCK = 0; // Internal SPI clock is enabled
	SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module
	SPI1CON1bits.MODE16 = 0; // Communication is byte-wide (8 bits)
	SPI1CON1bits.SMP = 0; // Input data is sampled at the middle of data output time

	SPI1CON1bits.CKE = 0; // Serial output data changes on transition
	// from Idle clock state to active clock state
	SPI1CON1bits.CKP = 1; // Idle state for clock is a high level;
	// active state is a low level
	SPI1CON1bits.MSTEN = 1; // Master mode enabled
	SPI1CON1bits.PPRE = 0b10; //0b01; // Primary prescale bit for SPI clock; 0b11 = 1:1;  0b10 = 4:1; 0b01 = 16:1; 0b00 = 64:1
	SPI1CON1bits.SPRE = 0b101; //0b011; // Secondary prescale bit for SPI clock; 0b111 = 1:1; 0b110 = 1:2 ... 0b000 = 1:8
	SPI1CON1bits.SSEN = 0; // Slave select pin disabled

	SPI1CON2bits.FRMEN = 0; // Frame mode disabled

	// SPISTAT Register Settings
	SPI1STATbits.SPIEN = 1; // Enable SPI module
	SPI1STATbits.SPISIDL = 0; // Continue module operation when device enters Idle mode

	// Interrupt Controller Settings
	SPI1STATbits.SPIROV = 0; // Clear SPI overflow bit
	IFS0bits.SPI1EIF = 0; // Clear SPI1 Error Interrupt Flag Status bit
	IPC2bits.SPI1IP = 0x06; // Set SPI1 Interrupt Priority Level to 1 = low priority
	IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
	IEC0bits.SPI1IE = 1; // Enable the Interrupt

	SG_DESELECT;
	loadcell_state.data_ready = 0;
	loadcell_state.spi_state = SPI_IDLE;

	// Configuration bits for ADC initialization
	uint8_t mode_byte_1 = 0;
	uint8_t mode_byte_2 = 0;
	uint8_t mode_byte_3 = 0;
	uint8_t config_byte_1;
	uint8_t config_byte_2;
	uint8_t config_byte_3;
	uint8_t gpocon_byte;


	loadcell_state.spi_state = SPI_VARIOUS;
	SG_SELECT;
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
	}
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
	}
	//reset chip
	SPI1BUF = 0xFF;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = 0xFF;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = 0xFF;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = 0xFF;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = 0xFF;
	spi_wait();
	SG_DESELECT;
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
	}
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
	}
	SG_SELECT;

	//write the MODE register
	SPI1BUF = SG_REG_MODE;
	spi_wait();
	mode_byte_1 = 0b00011100; //continuous mode, transmit status reg, MCLK2 is clock, average off (FS/2)

	mode_byte_2 = 0b00001100; //sinc4 enabled | no parity | no clock divide | single ("zero" latency) | 60hz rejection | Last two bits are top two bits of FS

	// These bits control the filtering and output freqeuency
	// It works in conjuction with the sinc, chopping, 50/60 rejection, and averaging modes
	mode_byte_3 = 4;

	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = mode_byte_1;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = mode_byte_2;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = mode_byte_3;
	spi_wait();
	SG_DESELECT;
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
	}

	SG_SELECT;
	loadcell_state.spi_state = SPI_VARIOUS;

	// Configuration Register
	SPI1BUF = SG_REG_CONFIG;
	spi_wait();
	//write the CONFIGURATION register
	config_byte_1 = 0b00000100; // Chop disabled / REFIN1 ref. / Pseudo enabled
	config_byte_2 = 0b00001111; // Enabled AIN1-4 / Disabled AIN5-8
	config_byte_3 = 0b01010111; // no burn / Ref. Detect enabled / Buffer enabled / bipolar / GAIN 128
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = config_byte_1;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = config_byte_2;
	spi_wait();
	loadcell_state.spi_state = SPI_VARIOUS;
	SPI1BUF = config_byte_3;
	spi_wait();
	SG_DESELECT;
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
	}

	SG_SELECT;
	// GPOCON Register
	SPI1BUF = SG_REG_GPOCON;
	spi_wait();
	//write the GPOCON Register
	for (i = 0; i < 65; ++i) {
		Nop();
	}
	loadcell_state.spi_state = SPI_VARIOUS;
	gpocon_byte = 0b00100100; // no Dridge Power-Down / P3&P2 enabled / P1&P0 disabled / P3 low / P2 High / P1&P0 low
	SPI1BUF = gpocon_byte;
	spi_wait();
	SG_DESELECT;
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
	}

	IC4CON1bits.ICM = 0b010; //interrupt on falling edge
	IC4CON2bits.TRIGSTAT = 0;
	for (i = 0; i < 65000; ++i) {
		Nop();
		Nop();
	}
	return loadcell_state.init_return;
}