i2c_slave.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "fw_hal.h"
  2. #define BUF_SIZE 256
  3. __BIT waitDeviceAddress;
  4. __BIT waitMemoryAddress;
  5. __XDATA uint8_t buffer[BUF_SIZE], addr;
  6. INTERRUPT(I2C_Routine, EXTI_VectI2C)
  7. {
  8. SFRX_ON();
  9. if (I2C_IsSlaveStartInterrupt())
  10. {
  11. I2C_ClearSlaveStartInterrupt();
  12. }
  13. else if (I2C_IsSlaveRecvInterrupt())
  14. {
  15. I2C_ClearSlaveRecvInterrupt();
  16. if (waitDeviceAddress) // Received device address
  17. {
  18. waitDeviceAddress = 0;
  19. }
  20. else if (waitMemoryAddress) // Received memory address
  21. {
  22. waitMemoryAddress = 0;
  23. addr = I2CRXD;
  24. I2CTXD = buffer[addr];
  25. }
  26. else // Received data
  27. {
  28. buffer[addr++] = I2CRXD;
  29. addr = addr % BUF_SIZE;
  30. }
  31. }
  32. else if (I2C_IsSlaveSendInterrupt())
  33. {
  34. I2C_ClearSlaveSendInterrupt();
  35. if (I2C_ReadSlaveAckIn()) // Stop when received NAK
  36. {
  37. I2CTXD = 0xFF;
  38. }
  39. else // Continue sending
  40. {
  41. I2CTXD = buffer[addr++];
  42. addr = addr % BUF_SIZE;
  43. }
  44. }
  45. else if (I2C_IsSlaveStopInterrupt())
  46. {
  47. I2C_ClearSlaveStopInterrupt();
  48. waitDeviceAddress = 1;
  49. waitMemoryAddress = 1;
  50. }
  51. SFRX_OFF();
  52. }
  53. void main()
  54. {
  55. I2C_SetWorkMode(I2C_WorkMode_Slave);
  56. // P15:SCL, P14:SDA
  57. I2C_SetPort(I2C_AlterPort_P15_P14);
  58. I2CSLADR = 0x5A;
  59. I2C_ClearAllSlaveInterrupts();
  60. EXTI_I2C_SetSlvStartIntState(HAL_State_ON);
  61. EXTI_I2C_SetSlvRecvIntState(HAL_State_ON);
  62. EXTI_I2C_SetSlvSendIntState(HAL_State_ON);
  63. EXTI_I2C_SetSlvStopIntState(HAL_State_ON);
  64. EXTI_Global_SetIntState(HAL_State_ON);
  65. waitDeviceAddress = 1;
  66. waitMemoryAddress = 1;
  67. addr = 0;
  68. I2CTXD = buffer[addr];
  69. I2C_SetEnabled(HAL_State_ON);
  70. while (1);
  71. }