From e7bc1934205ca68e753e0d0e500628e5476db92a Mon Sep 17 00:00:00 2001 From: mfenner <mfenner@e4d10518-288a-426b-ba36-e453799dee6f> Date: Mon, 22 Jun 2015 22:04:42 +0000 Subject: [PATCH] Finished Routines for I2C Programming. Function as command line tool not tested so far. git-svn-id: https://svnsrv.desy.de/desy/MSK_PROJECTS/other/Fuse-Relay-Board/MCU_Firmware/trunk@801 e4d10518-288a-426b-ba36-e453799dee6f --- FTDI_I2C/main.c | 160 ++++++++++++++++++---------------------- FTDI_I2C/proghyt.exe | Bin 38740 -> 38312 bytes FTDI_I2C/proghyt.layout | 12 +-- 3 files changed, 76 insertions(+), 96 deletions(-) diff --git a/FTDI_I2C/main.c b/FTDI_I2C/main.c index 8087b87..474a799 100644 --- a/FTDI_I2C/main.c +++ b/FTDI_I2C/main.c @@ -48,7 +48,6 @@ encountered \n",__FILE__, __LINE__, __FUNCTION__);exit(1);}else{;}}; /* Application specific macro definations */ -#define I2C_DEVICE_ADDRESS_HYT 0x50 >> 1 #define I2C_WRITE_COMPLETION_RETRY 10 #define CHANNEL_TO_OPEN 0 @@ -86,35 +85,6 @@ void waitFor (unsigned int secs) { * \note * \warning */ -FT_STATUS write_byte(uint8 slaveAddress, uint8 registerAddress, uint8 data) -{ - uint32 bytesToTransfer = 0; - uint32 bytesTransfered; - bool writeComplete=0; - uint32 retry=0; - - bytesToTransfer=0; - bytesTransfered=0; - buffer[bytesToTransfer++]=registerAddress; /* Byte addressed inside EEPROM */ - buffer[bytesToTransfer++]=data; - status = I2C_DeviceWrite(ftHandle, slaveAddress, bytesToTransfer, buffer, &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT|I2C_TRANSFER_OPTIONS_STOP_BIT); - - /* poll to check completition */ - while((writeComplete==0) && (retry<I2C_WRITE_COMPLETION_RETRY)) - { - bytesToTransfer=0; - bytesTransfered=0; - buffer[bytesToTransfer++]=registerAddress; /* Addressed inside EEPROM */ - status = I2C_DeviceWrite(ftHandle, slaveAddress, bytesToTransfer, buffer, &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT|I2C_TRANSFER_OPTIONS_BREAK_ON_NACK); - if((FT_OK == status) && (bytesToTransfer == bytesTransfered)) - { - writeComplete=1; - printf(" ... Write done\n"); - } - retry++; - } - return status; -} @@ -130,76 +100,67 @@ FT_STATUS write_hyt(uint8 slaveAddress, uint8 commandByte, uint8 datah, uint8 da buffer[bytesToTransfer++]=commandByte; buffer[bytesToTransfer++]=datah; buffer[bytesToTransfer++]=datal; - status = I2C_DeviceWrite(ftHandle, slaveAddress, bytesToTransfer, buffer, &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT|I2C_TRANSFER_OPTIONS_STOP_BIT); + status = I2C_DeviceWrite(ftHandle, slaveAddress, bytesToTransfer, buffer, &bytesTransfered, + I2C_TRANSFER_OPTIONS_START_BIT | + I2C_TRANSFER_OPTIONS_STOP_BIT | + //I2C_TRANSFER_OPTIONS_NACK_LAST_BYTE | + I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES + //I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BITS + //I2C_TRANSFER_OPTIONS_FAST_TRANSFER + ); APP_CHECK_STATUS(status); return status; } -FT_STATUS read_hyt(uint8 slaveAddress, uint8 *data) +FT_STATUS read_hyt(uint8 slaveAddress, uint8 *data, uint8 len) { FT_STATUS status; uint32 bytesToTransfer = 0; uint32 bytesTransfered; - status = I2C_DeviceRead(ftHandle, slaveAddress, 3, buffer, &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT | I2C_TRANSFER_OPTIONS_STOP_BIT); + status = I2C_DeviceRead(ftHandle, slaveAddress, len, buffer, &bytesTransfered, + I2C_TRANSFER_OPTIONS_START_BIT + //I2C_TRANSFER_OPTIONS_STOP_BIT | + //I2C_TRANSFER_OPTIONS_NACK_LAST_BYTE | + //I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES + ); APP_CHECK_STATUS(status); *data = buffer[0]; return status; } -/*! - * \brief Reads from EEPROM - * - * This function reads a byte from a specified address within the 24LC024H EEPROM - * - - * \param[in] slaveAddress Address of the I2C slave (EEPROM) - * \param[in] registerAddress Address of the memory location inside the slave from where the - * byte is to be read - * \param[in] *data Address to where the byte is to be read - * \return Returns status code of type FT_STATUS(see D2XX Programmer's Guide) - * \sa Datasheet of 24LC024H http://ww1.microchip.com/downloads/en/devicedoc/22102a.pdf - * \note - * \warning - */ -FT_STATUS read_byte(uint8 slaveAddress, uint8 registerAddress, uint8 *data) -{ - FT_STATUS status; - uint32 bytesToTransfer = 0; - uint32 bytesTransfered; - - bytesToTransfer=0; - bytesTransfered=0; - buffer[bytesToTransfer++]=registerAddress; /*Byte addressed inside EEPROM */ - status = I2C_DeviceWrite(ftHandle, slaveAddress, bytesToTransfer, buffer, \ - &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT); - APP_CHECK_STATUS(status); - bytesToTransfer=1; - bytesTransfered=0; - status |= I2C_DeviceRead(ftHandle, slaveAddress, bytesToTransfer, buffer, \ - &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT); - APP_CHECK_STATUS(status); - *data = buffer[0]; - return status; -} -int main() +int main(int argc, char *argv[]) { FT_STATUS status; FT_DEVICE_LIST_INFO_NODE devList; uint8 address; uint8 data; - int i,j; - - + uint8 CurrAddr=0x28; + uint8 NewAddr=0x31; + int i,j; + + if (argc != 2) + { + printf("Expected two arguments: proghyt [CurrentAddr] [NewAddr]\r\n"); + return 0; + } else printf("Changing address from %X to %X.\r\n",CurrAddr, NewAddr); + + CurrAddr=strtol(argv[1], NULL, 0); + NewAddr=strtol(argv[2], NULL, 0); + Init_libMPSSE(); - channelConf.ClockRate = I2C_CLOCK_STANDARD_MODE;/*i.e. 100000 KHz*/ + channelConf.ClockRate = 10000;/*i.e. 100000 KHz*/ channelConf.LatencyTimer= 2; - //channelConf.Options = I2C_DISABLE_3PHASE_CLOCKING; - //channelConf.Options = I2C_ENABLE_DRIVE_ONLY_ZERO; - + channelConf.Options = 0; + //channelConf.Options |= I2C_DISABLE_3PHASE_CLOCKING; + //channelConf.Options |= I2C_ENABLE_DRIVE_ONLY_ZERO; + //channelConf.Options |= I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES; + //channelConf.Options |= I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BITS; + //channelConf.Options |= I2C_TRANSFER_OPTIONS_FAST_TRANSFER; + status = I2C_GetNumChannels(&channels); APP_CHECK_STATUS(status); printf("Number of available I2C channels = %d\n",channels); @@ -224,11 +185,11 @@ int main() /* Open the first available channel */ status = I2C_OpenChannel(CHANNEL_TO_OPEN,&ftHandle); APP_CHECK_STATUS(status); - printf("%s\r\n",status); + printf("%d\r\n",status); printf("\nhandle=0x%x status=%d\n",ftHandle,status); status = I2C_InitChannel(ftHandle,&channelConf); APP_CHECK_STATUS(status); - printf("%s\r\n",status); + printf("%d\r\n",status); printf("Setting GPIO Pin OFF.\r\n"); @@ -237,31 +198,50 @@ int main() waitFor(1); printf("Setting GPIO Pin ON.\r\n"); FT_WriteGPIO(ftHandle, 0x01, 0x01); - //printf("%d\r\n",status); + printf("%d\r\n",status); - //printf("Starting Command Mode.\r\n"); - write_hyt(I2C_DEVICE_ADDRESS_HYT,0xA0,0x00,0x00); + printf("Starting Command Mode.\r\n"); + write_hyt(CurrAddr,0xA0,0x00,0x00); //printf("%d\r\n",status); - + read_hyt(CurrAddr, buffer, 1); + //printf("%X\r\n", buffer[0]); + if (buffer[0]==0x81) printf("success.\r\n"); + else if (buffer[0] | 0x40) printf("Failed: stale.\r\n"); + else printf("failed.\r\n"); + + + //printf("Request I2C Address.\r\n"); - write_hyt(I2C_DEVICE_ADDRESS_HYT,0x1C,0x00,0x00); + //write_hyt(CurrAddr,0x1C,0x00,0x00); //printf("%d\r\n",status); //waitFor(1); //printf("Reading I2C Address.\r\n"); - read_hyt( I2C_DEVICE_ADDRESS_HYT, buffer); - printf("%X %X %X\r\n", buffer[0], buffer[1], buffer[2]); - + //read_hyt( CurrAddr, buffer,3); + //printf("%X %X %X\r\n", buffer[0], buffer[1], buffer[2]); + + + printf("Writing new I2C Address.\r\n"); + write_hyt(CurrAddr,0x5C,0x00,NewAddr); + //printf("%d\r\n",status); + read_hyt(CurrAddr, buffer, 1); + //printf("%X\r\n", buffer[0]); + if (buffer[0]==0x81) printf("success.\r\n"); + else printf("failed.\r\n"); + + printf("Leaving Command Mode.\r\n"); - write_hyt(I2C_DEVICE_ADDRESS_HYT,0x80,0x00,0x00); - printf("%d\r\n",status); - + write_hyt(CurrAddr,0x80,0x00,0x00); + //printf("%d\r\n",status); + waitFor(1); + printf("Setting GPIO Pin OFF.\r\n"); + FT_WriteGPIO(ftHandle, 0x01, 0x00); + //printf("%d\r\n",status); printf("Closing Handle\r\n"); status = I2C_CloseChannel(ftHandle); } - Cleanup_libMPSSE(); diff --git a/FTDI_I2C/proghyt.exe b/FTDI_I2C/proghyt.exe index 6dd60eb61973ca04961fb4040d218ca53631d77d..0fbbdafda7dd30c1f9928e5b7bc332b11c46da70 100644 GIT binary patch delta 10827 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 U{Rb44R#+^qh1$C4m0SG(0onb~82|tP delta 10843 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 b*-RYS;|L?KI{Xz>%Jtt4F2Hq^++zO&ocX?T diff --git a/FTDI_I2C/proghyt.layout b/FTDI_I2C/proghyt.layout index fd9f05a..f14cdad 100644 --- a/FTDI_I2C/proghyt.layout +++ b/FTDI_I2C/proghyt.layout @@ -4,9 +4,9 @@ CursorRow=1 TopLine=1 LeftChar=1 [Editor_1] -CursorCol=1 -CursorRow=1 -TopLine=35 +CursorCol=44 +CursorRow=50 +TopLine=34 LeftChar=1 Open=1 Top=0 @@ -16,7 +16,7 @@ Order=0,1 [Editor_0] Open=1 Top=1 -CursorCol=33 -CursorRow=238 -TopLine=227 +CursorCol=12 +CursorRow=146 +TopLine=118 LeftChar=1 -- GitLab