fork download
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4.  
  5. static uint32_t data = 0xEDEDF0F0;
  6.  
  7. static void asic_spi_read_tx(uint32_t address, uint32_t * const read_data)
  8. {
  9. *read_data = data;
  10. }
  11.  
  12. static void asic_spi_write_tx(uint32_t address, uint32_t new_data, bool read_now)
  13. {
  14. data = new_data;
  15. data |= 16;
  16. }
  17.  
  18. static bool read_modify_bits(uint32_t modify_mask, uint32_t new_bits)
  19. {
  20. bool success = true;
  21. uint32_t address = 0;
  22. uint32_t read_data = 0;
  23. asic_spi_read_tx(address, &read_data);
  24. printf("initial read_data = %x\n", read_data);
  25. uint32_t new_data = read_data;
  26. // Modify only masked bits
  27. for (uint32_t bit = 0; bit < 32; bit++)
  28. {
  29. if ((modify_mask & (1 << bit)) != 0)
  30. {
  31. // Bit is masked
  32. if ((new_bits & (1 << bit)) != 0)
  33. {
  34. // Bit should be set
  35. new_data |= 1 << bit;
  36. printf("Setting bit %u\n", bit);
  37. }
  38. else
  39. {
  40. // Bit should be cleared
  41. new_data &= ~(1 << bit);
  42. printf("Clearing bit %u\n", bit);
  43. }
  44. }
  45. }
  46. // Write new bits
  47. asic_spi_write_tx(address, new_data, true);
  48. // Read to verify bits were properly set/cleared
  49. asic_spi_read_tx(address, &read_data);
  50. // Verify bits were set
  51. if ((read_data & modify_mask) != new_bits)
  52. {
  53. printf("read_data = %x\n", read_data);
  54. success = false;
  55. }
  56. else
  57. {
  58. printf("read_data = %x\n", read_data);
  59. }
  60. return success;
  61. }
  62.  
  63. int main(void) {
  64. // your code goes here
  65. const bool success = read_modify_bits(0xFFFF, 0x0F0F);
  66. if (success)
  67. {
  68. printf("SUCCESS!");
  69. }
  70. else
  71. {
  72. printf("FAILURE!");
  73. }
  74.  
  75. return 0;
  76. }
  77.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
initial read_data = ededf0f0
Setting bit 0
Setting bit 1
Setting bit 2
Setting bit 3
Clearing bit 4
Clearing bit 5
Clearing bit 6
Clearing bit 7
Setting bit 8
Setting bit 9
Setting bit 10
Setting bit 11
Clearing bit 12
Clearing bit 13
Clearing bit 14
Clearing bit 15
read_data = eded0f1f
FAILURE!