Skip to content
Snippets Groups Projects
Commit e7bc1934 authored by mfenner's avatar mfenner
Browse files

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
parent 638d3eec
No related branches found
No related tags found
No related merge requests found
......@@ -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();
......
No preview for this file type
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment