Ejemplo n.º 1
0
void d8x8matrix_write(const device_info_t *device_info, const char *buf, uint8_t nbyte) {
	char c;
	uint8_t i;
	int j, k;

	if (nbyte > device_info->internal.count) {
		nbyte = device_info->internal.count;
	}

	for (i = 1; i < 9; i++) {
		k = (int) nbyte;

		for (j = 0; j < ((int) device_info->internal.count * 2) - ((int) nbyte * 2); j = j + 2) {
			spi_data[j] = MAX7219_REG_NOOP;
			spi_data[j + 1] = 0;
		}

		while (--k >= 0) {
			c = buf[k];
			spi_data[j++] = i;
			spi_data[j++] = rotate((uint8_t) c, 8 - i);
		}

		if (device_info->chip_select == SPI_CS2) {
			bcm2835_aux_spi_setClockDivider(device_info->internal.clk_div);
			bcm2835_aux_spi_writenb((const char *) spi_data, (uint32_t) j);
		} else {
			bcm2835_spi_setClockDivider(device_info->internal.clk_div);
			bcm2835_spi_chipSelect(device_info->chip_select);
			bcm2835_spi_writenb((const char *) spi_data, (uint32_t) j);
		}
	}
}
Ejemplo n.º 2
0
inline static void _draw_char(int c, uint32_t x, uint32_t y, uint16_t fore, uint16_t back) {
	uint32_t i, j;
	uint8_t line;
	unsigned char *p = (unsigned char *) cp437_font + (c * (int) FONT_CHAR_H);

	uint16_t buffer[FONT_CHAR_H * FONT_CHAR_W];
	uint16_t *q = buffer;

	for (i = 0; i < FONT_CHAR_H; i++) {
		line = (uint8_t) *p++;
		for (j = 0; j < FONT_CHAR_W; j++) {
			if ((line & 0x1) != 0) {
				*q = __builtin_bswap16(fore);
			} else {
				*q = __builtin_bswap16(back);
			}
			line >>= 1;
			q++;
		}
	}

	write_command(0x2A);
	write_data_word(x);
	write_data_word(x + FONT_CHAR_H - 1);
	write_command(0x2B);
	write_data_word(y);
	write_data_word(y + FONT_CHAR_W - 1);
	write_command(0x2C);

	bcm2835_spi_writenb((char *) buffer, 2 * FONT_CHAR_H * FONT_CHAR_W);
}
//void bcm2835_spi_writenb(char* buf, uint32_t len);
/// Call bcm2835_spi_writenb with 2 parameters
/// \par            Refer
/// \par            Modify
void ope_spi_writenb(void)
{
uint32_t len;
    get_int_code();
    get_int_code();
    len = *(uint32_t *)(buff+5);
    bcm2835_spi_writenb( bi_send_buff, len );
}
Ejemplo n.º 4
0
void bw_spi_dio_output(device_info_t *device_info, uint8_t pins) {
	char cmd[3];

	cmd[0] = device_info->slave_address;
	cmd[1] = BW_PORT_WRITE_SET_ALL_OUTPUTS;
	cmd[2] = pins;

	dio_spi_setup(device_info);
	bcm2835_spi_writenb(cmd, sizeof(cmd) / sizeof(char));
	uwait(BW_DIO_SPI_BYTE_WAIT_US);
}
Ejemplo n.º 5
0
void bw_spi_dio_fsel_mask(device_info_t *device_info, uint8_t mask) {
	char cmd[3];

	cmd[0] = device_info->slave_address;
	cmd[1] = BW_PORT_WRITE_IO_DIRECTION;
	cmd[2] = mask;
	dio_spi_setup(device_info);

	bcm2835_spi_writenb(cmd, sizeof(cmd) / sizeof(char));
	uwait(BW_DIO_SPI_BYTE_WAIT_US);
}
Ejemplo n.º 6
0
// write data via SPI to tft
// ----------------------------------------------------------
void TFT_SPI_data_out ( uint16_t data )
{
	union my_union number;
	char buffer[2];

	number.value = data;
	buffer[0] = (char) number.split.high;
	buffer[1] = (char) number.split.low;
	
	bcm2835_spi_writenb( &buffer[0], 2 );
}
Ejemplo n.º 7
0
void ili9340_clear(void) {
	write_command(0x2A);
	write_data_word(0);
	write_data_word(239);
	write_command(0x2B);
	write_data_word(0);
	write_data_word(319);
	write_command(0x2C);

	bcm2835_spi_writenb((char *) buffer, 2 * ILI9340_HEIGHT * ILI9340_WIDTH);
}
Ejemplo n.º 8
0
Archivo: spi.c Proyecto: sjhx/etrv
void spi_transfern(char *buf, uint32_t len) {
	int ret;
        //dump("TR tx", (uint8_t *)buf, len);
	
#ifdef BCM
	bcm2835_spi_transfern(buf, len);
#else
	uint8_t *rx = malloc(len);
	struct spi_ioc_transfer tr = {
		.tx_buf = (unsigned long)buf,
		.rx_buf = (unsigned long)rx,
		.len = len,
		.delay_usecs = delay,
		.speed_hz = speed,
		.bits_per_word = bits,
	};

	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
	if (ret < 1) {
		free(rx);
		pabort("can't send spi message");
	}
	memcpy(buf, rx, len);
	free(rx);
#endif
}

void spi_writenb(char * buf, uint32_t len) {
	int ret;
	dump("WR tx", (uint8_t *)buf, len);
#ifdef BCM
	bcm2835_spi_writenb(buf, len);
#else
	struct spi_ioc_transfer tr = {
		.tx_buf = (unsigned long)buf,
		.rx_buf = (unsigned long)0,
		.len = len,
		.delay_usecs = delay,
		.speed_hz = speed,
		.bits_per_word = bits,
	};

	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
	if (ret < 1)
		pabort("can't send spi message");
#endif
}
Ejemplo n.º 9
0
void bw_spi_dimmer_output(const device_info_t *device_info, uint8_t value) {
	char cmd[3];

	cmd[0] = (char) device_info->slave_address;
	cmd[1] = (char) BW_PORT_WRITE_DIMMER;
	cmd[2] = (char) value;

	if (device_info->chip_select == SPI_CS2) {
		bcm2835_aux_spi_setClockDivider(device_info->internal.clk_div);
		bcm2835_aux_spi_writenb(cmd, sizeof(cmd) / sizeof(cmd[0]));
	} else {
		bcm2835_spi_setClockDivider(device_info->internal.clk_div);
		bcm2835_spi_chipSelect(device_info->chip_select);
		bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);
		bcm2835_spi_writenb(cmd, sizeof(cmd) / sizeof(cmd[0]));
	}
}
Ejemplo n.º 10
0
void ee_write(unsigned int BufferOffset,unsigned char data)
{
   unsigned char temp[]={0x84,0xff};

	bcm2835_gpio_write(PIN_CS, LOW); /*must be called*/
	delay_ms(500);

   bcm2835_spi_writenb(temp,2); 

	delay_ms(50);
   bcm2835_spi_transfer((unsigned char)(BufferOffset>>8));
	delay_ms(50);
   bcm2835_spi_transfer((unsigned char)BufferOffset);
	delay_ms(50);
   bcm2835_spi_transfer(data);
	delay_ms(50);
	bcm2835_gpio_write(PIN_CS, HIGH);  /*must be called*/
	delay_ms(300);
}
Ejemplo n.º 11
0
static void write_all(const device_info_t *device_info, const uint8_t reg, const uint8_t data) {
	uint8_t i;

	if ((device_info->internal.count * 2) > sizeof(spi_data)) {
		return;
	}

	for (i = 0; i < (device_info->internal.count * 2); i = i + 2) {
		spi_data[i] = reg;
		spi_data[i+1] = data;
	}

	if (device_info->chip_select == SPI_CS2) {
		bcm2835_aux_spi_setClockDivider(device_info->internal.clk_div);
		bcm2835_aux_spi_writenb((const char *) spi_data, device_info->internal.count * 2);
	} else {
		bcm2835_spi_setClockDivider(device_info->internal.clk_div);
		bcm2835_spi_chipSelect(device_info->chip_select);
		bcm2835_spi_writenb((const char *) spi_data, device_info->internal.count * 2);
	}

}
Ejemplo n.º 12
0
inline void ArduiPi_OLED::fastSPIwrite(char* tbuf, uint32_t len) {
  bcm2835_spi_writenb(tbuf, len);
}
Ejemplo n.º 13
0
int main(int argc, char **argv)
{
    int16_t ledIndexCounter = 0, scanPasses=0, colourIndex=0;
	
	initData();
	
	//Initiate the SPI Data Frame
	if (!bcm2835_init())
    {
      printf("bcm2835_init failed. Are you running as root??\n");
      return 1;
    }
    if (!bcm2835_spi_begin())
    {
      printf("bcm2835_spi_begin failedg. Are you running as root??\n");
      return 1;
    }
    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default
	/*
		
	BCM2835_SPI_MODE0 		CPOL = 0, CPHA = 0
	BCM2835_SPI_MODE1 		CPOL = 0, CPHA = 1
	BCM2835_SPI_MODE2 		CPOL = 1, CPHA = 0
	BCM2835_SPI_MODE3 		CPOL = 1, CPHA = 1	
	*/
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_16); // The default
	/*

		BCM2835_SPI_CLOCK_DIVIDER_65536 	65536 = 262.144us = 3.814697260kHz
		BCM2835_SPI_CLOCK_DIVIDER_32768 	32768 = 131.072us = 7.629394531kHz
		BCM2835_SPI_CLOCK_DIVIDER_16384 	16384 = 65.536us = 15.25878906kHz
		BCM2835_SPI_CLOCK_DIVIDER_8192 		8192 = 32.768us = 30/51757813kHz
		BCM2835_SPI_CLOCK_DIVIDER_4096 		4096 = 16.384us = 61.03515625kHz
		BCM2835_SPI_CLOCK_DIVIDER_2048 		2048 = 8.192us = 122.0703125kHz
		BCM2835_SPI_CLOCK_DIVIDER_1024 		1024 = 4.096us = 244.140625kHz
		BCM2835_SPI_CLOCK_DIVIDER_512 		512 = 2.048us = 488.28125kHz
		BCM2835_SPI_CLOCK_DIVIDER_256 		256 = 1.024us = 976.5625kHz
		BCM2835_SPI_CLOCK_DIVIDER_128 		128 = 512ns = = 1.953125MHz
		BCM2835_SPI_CLOCK_DIVIDER_64 		64 = 256ns = 3.90625MHz
		BCM2835_SPI_CLOCK_DIVIDER_32 		32 = 128ns = 7.8125MHz
		BCM2835_SPI_CLOCK_DIVIDER_16 		16 = 64ns = 15.625MHz
		BCM2835_SPI_CLOCK_DIVIDER_8 		8 = 32ns = 31.25MHz
		BCM2835_SPI_CLOCK_DIVIDER_4 		4 = 16ns = 62.5MHz
		BCM2835_SPI_CLOCK_DIVIDER_2 		2 = 8ns = 125MHz, fastest you can get	
	
	*/
    bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default
    bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default
    
	for(colourIndex=0; colourIndex<rainbowSize*10; colourIndex+=5)
	{
		getColour(colourIndex%rainbowSize, tmpColour);
		//set 1st Pixel
		ledDataBlock[8]=255;
		ledDataBlock[9]=tmpColour[2];
		ledDataBlock[10]=tmpColour[1];
		ledDataBlock[11]=tmpColour[0];
		//push the array
		for(ledIndexCounter=(spiFrameLength-(endFrameLength*bytesPerLED))-bytesPerLED; ledIndexCounter>8; ledIndexCounter-=bytesPerLED)
		{
			ledDataBlock[ledIndexCounter] = ledDataBlock[ledIndexCounter-bytesPerLED];
			ledDataBlock[ledIndexCounter+1] = ledDataBlock[ledIndexCounter+1-bytesPerLED];
			ledDataBlock[ledIndexCounter+2] = ledDataBlock[ledIndexCounter+2-bytesPerLED];
			ledDataBlock[ledIndexCounter+3] = ledDataBlock[ledIndexCounter+3-bytesPerLED];
		}
		//send to LEDs
		bcm2835_spi_writenb(ledDataBlock, spiFrameLength);
		bcm2835_delay(5);
	}
    //clear and render
	initData();
	bcm2835_spi_writenb(ledDataBlock, spiFrameLength);
	//close the spi bus
	bcm2835_spi_end();
    bcm2835_close();
    return 0;
}
Ejemplo n.º 14
0
/**
 *@brief Writes an array of bytes to the SPI bus
 *@param buff Pointer to array of char data.
 *@param length Length of data array.
 *@return none
 */
void SPI_Write_Array(char* buff, unsigned int length)
{
	bcm2835_spi_writenb(buff,length);
}