Hello,
I wrote the code for HT1632 using SPI Protocol
while debugging when it comes to below function it will stop debugging
HT1632_5X21_init( LED_MAX_DISPLAY_X, LED_MAX_DISPLAY_Y);
is this correct way for using SPI transfer
void HT1632_5X21_init(uint8_t aneDevices, uint8_t twoDevices)
{
uint8_t i;
numXDevices = aneDevices;
//aneMax=31;
aneMax = 32 * numXDevices-1;
numYDevices = twoDevices;
twoMax = 8 * numYDevices-1;
//twoMax = 7;
numDevices = numXDevices * numYDevices;
static uint8_t m_tx_buf[9] = {HT1632_ID_CMD,HT1632_CMD_SYSDIS,HT1632_CMD_COMS10,HT1632_CMD_MSTMD,HT1632_CMD_SYSON,HT1632_CMD_LEDON,HT1632_CMD_PWM | 0x0c,0,1}; /**< TX buffer. */
static const uint8_t m_length = sizeof(m_tx_buf);
static uint8_t m_rx_buf[sizeof(m_tx_buf)+1];
memset(s_rx_buf, 0, s_length);
APP_ERROR_CHECK(nrf_drv_spis_buffers_set(&spis, s_tx_buf, s_length, s_rx_buf, s_length));
memset(m_rx_buf, 0, m_length);
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));
cursorX = 0;
cursorY = 0;
for ( i=0; i<64; i++)
HT1632_LedMatrix_senddata(chipno,i,0);
}
void HT1632_LedMatrix_senddata (uint8_t chipno, uint8_t i, uint8_t data )
{
uint8_t n_tx_buf[3] = {HT1632_ID_WR, i,0}; /**< TX buffer. */
static const uint8_t n_length = sizeof(n_tx_buf);
static uint8_t n_rx_buf[sizeof(n_tx_buf)+1]; /**< RX buffer. */
memset(t_rx_buf, 0, t_length);
APP_ERROR_CHECK(nrf_drv_spis_buffers_set(&spis, t_tx_buf, t_length, t_rx_buf, t_length));
memset(n_rx_buf, 0, n_length);
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, n_tx_buf, n_length, n_rx_buf, n_length));
//nrf_delay_ms(10);
}
void putString(int ane, int two, char *str) {
cursorX = ane;
cursorY = two;
while(*str!='\0') {
putChar( cursorX, two, *str++ );
cursorX += 6;
}
}
int putChar(int ane, int two, char c) {
// fonts defined for ascii 32 and beyond (index 0 in font array is ascii 32);
// CGRAM characters are in range 0 to 15 with 8-15 being repeat of 0-7
// note we force y to be modulo 8 - we do not support writing character to partial y values.
uint8_t charIndex;
uint8_t colData;
uint8_t numCols;
uint8_t chipno;
uint8_t addr;
uint8_t colsLeft = 0; // cols that didn't fit
if( c > 15 )
{
// Regular characters
// replace undisplayable characters with blank;
if (c < 32 || c > 126)
{
charIndex = 0;
}
else
{
charIndex = c - 32;
}
// move character definition, pixel by pixel, onto the display;
// fonts are defined as one byte per col;
numCols=smallFont[charIndex][6]; // get the number of columns this character uses
for (uint8_t col=0; col<numCols; col++) {
colData = smallFont[charIndex][col];
// chipno = chip_number(x,y);
addr = chip_byte_address(ane,two); // compute which memory byte this is in
if (ane <= aneMax && two <= twoMax) {
shadowram[(addr>>1)+32*chipno] = colData;
sendcol(chipno,addr,colData);
ane++;
} else {
colsLeft++;
}
}
} else {
// CGRAM Characters
charIndex = c & 0x07; // Only low 3 bits count
numCols=cgram[charIndex][0]; // get the number of columns this character uses
// fonts are defined as one byte per col;
for (uint8_t col=1; col<=numCols; col++) {
colData = cgram[charIndex][col];
//chipno=1;
//chipno = chip_number(x,y);
addr = chip_byte_address(ane,two); // compute which memory byte this is in
if (ane <= aneMax && two <= twoMax) {
shadowram[(addr>>1)+32*chipno] = colData;
sendcol(chipno,addr,colData);
ane++;
} else {
colsLeft++;
}
}
}
cursorX = ane;
cursorY = two;
//clear();
return colsLeft;
}
void sendcol( uint8_t chipno, uint8_t address, uint8_t data)
{
uint8_t o_tx_buf[3] = {HT1632_ID_WR,address,data};
static const uint8_t o_length = sizeof(o_tx_buf);
static uint8_t o_rx_buf[sizeof(o_tx_buf)+1]; /**< RX buffer. */
memset(u_rx_buf, 0, u_length);
APP_ERROR_CHECK(nrf_drv_spis_buffers_set(&spis, u_tx_buf, u_length, u_rx_buf, u_length));
memset(o_rx_buf, 0, o_length);
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, o_tx_buf, o_length, o_rx_buf, o_length));
}
//void clear()
//{
//
//static uint8_t p_tx_buf[3]={HT1632_ID_WR,0x00};
//static const uint8_t p_length = sizeof(p_tx_buf);
//static uint8_t p_rx_buf[sizeof(p_tx_buf)+1]; /**< RX buffer. */
//APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, p_tx_buf, p_length, p_rx_buf, p_length));
//
// cursorX = 0;
// cursorY = 0;
//}
int main()
{
printf("HT1632 Driver started.");
bsp_board_init(BSP_INIT_LEDS);
//unsigned char str[]={"technical"};
unsigned char str2[]={"welcome"};
spi_init();
// NRF_POWER->TASKS_CONSTLAT = 1;
spis_init();
HT1632_5X21_init( LED_MAX_DISPLAY_X, LED_MAX_DISPLAY_Y);
putString(0,0,str2);
while(1)
{
__WFE();
}
}
what is wrong with HT1632_5X21_init( LED_MAX_DISPLAY_X, LED_MAX_DISPLAY_Y); and putString(0,0,str2); functions
thanks
learn
