FSensor PAT9125 - i2c ACK check + two attempts in init function (PFW).

ultralcd_implementation_hitachi - fixed link
This commit is contained in:
Robert Pelnar 2018-04-11 16:03:54 +02:00
parent da43aa0250
commit 8da2330b93
3 changed files with 51 additions and 8 deletions

View file

@ -63,7 +63,7 @@ bool fsensor_enable()
{ {
// puts_P(PSTR("fsensor_enable\n")); // puts_P(PSTR("fsensor_enable\n"));
int pat9125 = pat9125_init(); int pat9125 = pat9125_init();
// printf_P(PSTR("PAT9125_init:%d\n"), pat9125); printf_P(PSTR("PAT9125_init:%d\n"), pat9125);
if (pat9125) if (pat9125)
fsensor_not_responding = false; fsensor_not_responding = false;
else else
@ -74,6 +74,7 @@ bool fsensor_enable()
fsensor_err_cnt = 0; fsensor_err_cnt = 0;
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, fsensor_enabled?0x01:0x00); eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, fsensor_enabled?0x01:0x00);
FSensorStateMenu = fsensor_enabled?1:0; FSensorStateMenu = fsensor_enabled?1:0;
// printf_P(PSTR("fsensor_enable - end %d\n"), fsensor_enabled?1:0);
return fsensor_enabled; return fsensor_enabled;
} }
@ -108,7 +109,14 @@ void fsensor_setup_interrupt()
void fsensor_autoload_check_start(void) void fsensor_autoload_check_start(void)
{ {
// puts_P(PSTR("fsensor_autoload_check_start\n")); // puts_P(PSTR("fsensor_autoload_check_start\n"));
pat9125_update_y(); //update sensor if (!pat9125_update_y()) //update sensor
{
puts_P(PSTR("pat9125 not responding (3).\n"));
fsensor_disable();
fsensor_not_responding = true;
fsensor_autoload_enabled = false;
return;
}
fsensor_autoload_y = pat9125_y; //save current y value fsensor_autoload_y = pat9125_y; //save current y value
fsensor_autoload_c = 0; //reset number of changes counter fsensor_autoload_c = 0; //reset number of changes counter
fsensor_autoload_sum = 0; fsensor_autoload_sum = 0;
@ -130,7 +138,13 @@ bool fsensor_check_autoload(void)
uint8_t fsensor_autoload_c_old = fsensor_autoload_c; uint8_t fsensor_autoload_c_old = fsensor_autoload_c;
if ((millis() - fsensor_autoload_last_millis) < 25) return false; if ((millis() - fsensor_autoload_last_millis) < 25) return false;
fsensor_autoload_last_millis = millis(); fsensor_autoload_last_millis = millis();
pat9125_update_y(); //update sensor if (!pat9125_update_y())
{
puts_P(PSTR("pat9125 not responding (2).\n"));
fsensor_disable();
fsensor_not_responding = true;
return false; //update sensor
}
int16_t dy = fsensor_autoload_y - pat9125_y; int16_t dy = fsensor_autoload_y - pat9125_y;
if (dy) //? y value is different if (dy) //? y value is different
{ {
@ -170,9 +184,9 @@ ISR(PCINT2_vect)
*digitalPinToPCMSK(fsensor_int_pin) |= bit(digitalPinToPCMSKbit(fsensor_int_pin));*/ *digitalPinToPCMSK(fsensor_int_pin) |= bit(digitalPinToPCMSKbit(fsensor_int_pin));*/
if (!pat9125_update_y()) if (!pat9125_update_y())
{ {
#ifdef DEBUG_FSENSOR_LOG //#ifdef DEBUG_FSENSOR_LOG
puts_P(PSTR("pat9125 not responding.\n")); puts_P(PSTR("pat9125 not responding (1).\n"));
#endif //DEBUG_FSENSOR_LOG //#endif //DEBUG_FSENSOR_LOG
fsensor_disable(); fsensor_disable();
fsensor_not_responding = true; fsensor_not_responding = true;
} }

View file

@ -92,7 +92,10 @@ int pat9125_init()
// pat9125_PID2 = 0x91; // pat9125_PID2 = 0x91;
if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91)) if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
{ {
return 0; pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
return 0;
} }
// Switch to bank0, not allowed to perform OTS_RegWriteRead. // Switch to bank0, not allowed to perform OTS_RegWriteRead.
pat9125_wr_reg(PAT9125_BANK_SELECTION, 0); pat9125_wr_reg(PAT9125_BANK_SELECTION, 0);
@ -132,6 +135,9 @@ int pat9125_init()
pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x00); pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x00);
// Enable write protect. // Enable write protect.
pat9125_wr_reg(PAT9125_WP, 0x00); pat9125_wr_reg(PAT9125_WP, 0x00);
pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
return 1; return 1;
} }
@ -142,11 +148,13 @@ int pat9125_update()
unsigned char ucMotion = pat9125_rd_reg(PAT9125_MOTION); unsigned char ucMotion = pat9125_rd_reg(PAT9125_MOTION);
pat9125_b = pat9125_rd_reg(PAT9125_FRAME); pat9125_b = pat9125_rd_reg(PAT9125_FRAME);
pat9125_s = pat9125_rd_reg(PAT9125_SHUTTER); pat9125_s = pat9125_rd_reg(PAT9125_SHUTTER);
if (pat9125_PID1 == 0xff) return 0;
if (ucMotion & 0x80) if (ucMotion & 0x80)
{ {
unsigned char ucXL = pat9125_rd_reg(PAT9125_DELTA_XL); unsigned char ucXL = pat9125_rd_reg(PAT9125_DELTA_XL);
unsigned char ucYL = pat9125_rd_reg(PAT9125_DELTA_YL); unsigned char ucYL = pat9125_rd_reg(PAT9125_DELTA_YL);
unsigned char ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH); unsigned char ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH);
if (pat9125_PID1 == 0xff) return 0;
int iDX = ucXL | ((ucXYH << 4) & 0xf00); int iDX = ucXL | ((ucXYH << 4) & 0xf00);
int iDY = ucYL | ((ucXYH << 8) & 0xf00); int iDY = ucYL | ((ucXYH << 8) & 0xf00);
if (iDX & 0x800) iDX -= 4096; if (iDX & 0x800) iDX -= 4096;
@ -164,10 +172,12 @@ int pat9125_update_y()
if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91)) if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91))
{ {
unsigned char ucMotion = pat9125_rd_reg(PAT9125_MOTION); unsigned char ucMotion = pat9125_rd_reg(PAT9125_MOTION);
if (pat9125_PID1 == 0xff) return 0;
if (ucMotion & 0x80) if (ucMotion & 0x80)
{ {
unsigned char ucYL = pat9125_rd_reg(PAT9125_DELTA_YL); unsigned char ucYL = pat9125_rd_reg(PAT9125_DELTA_YL);
unsigned char ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH); unsigned char ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH);
if (pat9125_PID1 == 0xff) return 0;
int iDY = ucYL | ((ucXYH << 8) & 0xf00); int iDY = ucYL | ((ucXYH << 8) & 0xf00);
if (iDY & 0x800) iDY -= 4096; if (iDY & 0x800) iDY -= 4096;
pat9125_y -= iDY; //negative number, because direction switching does not work pat9125_y -= iDY; //negative number, because direction switching does not work
@ -179,6 +189,7 @@ int pat9125_update_y()
unsigned char pat9125_rd_reg(unsigned char addr) unsigned char pat9125_rd_reg(unsigned char addr)
{ {
// printf_P(PSTR("pat9125_rd_reg 0x%hhx "), addr);
unsigned char data = 0; unsigned char data = 0;
#ifdef PAT9125_SWSPI #ifdef PAT9125_SWSPI
swspi_start(); swspi_start();
@ -188,6 +199,14 @@ unsigned char pat9125_rd_reg(unsigned char addr)
#endif //PAT9125_SWSPI #endif //PAT9125_SWSPI
#ifdef PAT9125_SWI2C #ifdef PAT9125_SWI2C
int iret = swi2c_readByte_A8(PAT9125_I2C_ADDR, addr, &data); int iret = swi2c_readByte_A8(PAT9125_I2C_ADDR, addr, &data);
if (!iret) //NO ACK error
{
pat9125_PID1 = 0xff;
pat9125_PID2 = 0xff;
// printf_P(PSTR("ERR\n"));
return 0;
}
// printf_P(PSTR("0x%hhx OK\n"), data);
#endif //PAT9125_SWI2C #endif //PAT9125_SWI2C
#ifdef PAT9125_HWI2C #ifdef PAT9125_HWI2C
Wire.beginTransmission(PAT9125_I2C_ADDR); Wire.beginTransmission(PAT9125_I2C_ADDR);
@ -202,6 +221,7 @@ unsigned char pat9125_rd_reg(unsigned char addr)
void pat9125_wr_reg(unsigned char addr, unsigned char data) void pat9125_wr_reg(unsigned char addr, unsigned char data)
{ {
// printf_P(PSTR("pat9125_wr_reg 0x%hhx 0x%hhx "), addr, data);
#ifdef PAT9125_SWSPI #ifdef PAT9125_SWSPI
swspi_start(); swspi_start();
swspi_tx(addr | 0x80); swspi_tx(addr | 0x80);
@ -210,6 +230,15 @@ void pat9125_wr_reg(unsigned char addr, unsigned char data)
#endif //PAT9125_SWSPI #endif //PAT9125_SWSPI
#ifdef PAT9125_SWI2C #ifdef PAT9125_SWI2C
int iret = swi2c_writeByte_A8(PAT9125_I2C_ADDR, addr, &data); int iret = swi2c_writeByte_A8(PAT9125_I2C_ADDR, addr, &data);
if (!iret) //NO ACK error
{
pat9125_PID1 = 0xff;
pat9125_PID2 = 0xff;
// printf_P(PSTR("ERR\n"));
return;
}
// printf_P(PSTR("OK\n"));
#endif //PAT9125_SWI2C #endif //PAT9125_SWI2C
#ifdef PAT9125_HWI2C #ifdef PAT9125_HWI2C
Wire.beginTransmission(PAT9125_I2C_ADDR); Wire.beginTransmission(PAT9125_I2C_ADDR);

View file

@ -194,7 +194,7 @@ extern volatile uint16_t buttons; //an extended version of the last checked but
LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT); LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT);
// 2 wire Non-latching LCD SR from: // 2 wire Non-latching LCD SR from:
// https://bitbucket.org/fmalpartida/new-LiquidCrystal_Prusa/wiki/schematics#!shiftregister-connection // https://bitbucket.org/fmalpartida/new-LiquidCrystal/wiki/schematics#!shiftregister-connection
#elif defined(SR_LCD_2W_NL) #elif defined(SR_LCD_2W_NL)
extern "C" void __cxa_pure_virtual() { while (1); } extern "C" void __cxa_pure_virtual() { while (1); }