[PIC®/AVR®/dsPIC®产品] AVR的SPI入门

[复制链接]
1254|2
 楼主| 小明的同学 发表于 2024-3-30 22:05 | 显示全部楼层 |阅读模式
vr, spi, pi, AVR


  1. #include <avr/io.h>
  2. void SPI0_init(void);
  3. void slaveSelect(void);
  4. void slaveDeselect(void);
  5. uint8_t SPI0_exchangeData(uint8_t data);
  6. void SPI0_init(void)
  7. {
  8. PORTA.DIR |= PIN4_bm; /* Set MOSI pin direction to output */
  9. PORTA.DIR &= ~PIN5_bm; /* Set MISO pin direction to input */
  10. PORTA.DIR |= PIN6_bm; /* Set SCK pin direction to output */
  11. PORTA.DIR |= PIN7_bm; /* Set SS pin direction to output */
  12. SPI0.CTRLA = SPI_CLK2X_bm /* Enable double-speed */
  13. | SPI_DORD_bm /* LSB is transmitted first */
  14. | SPI_ENABLE_bm /* Enable module */
  15. | SPI_MASTER_bm /* SPI module in Master mode */
  16. | SPI_PRESC_DIV16_gc; /* System Clock divided by 16 */
  17. }
  18. uint8_t SPI0_exchangeData(uint8_t data)
  19. {
  20. SPI0.DATA = data;
  21. while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
  22. {
  23. ;
  24. }
  25. return SPI0.DATA;
  26. }
  27. void slaveSelect(void)
  28. {
  29. PORTA.OUT &= ~PIN7_bm; // Set SS pin value to LOW
  30. }
  31. void slaveDeselect(void)
  32. {
  33. PORTA.OUT |= PIN7_bm; // Set SS pin value to HIGH
  34. }
  35. int main(void)
  36. {
  37. uint8_t data = 0;
  38. SPI0_init();
  39. while (1)
  40. {
  41. slaveSelect();
  42. SPI0_exchangeData(data);
  43. slaveDeselect();
  44. }
  45. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 小明的同学 发表于 2024-3-30 22:05 | 显示全部楼层
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. void SPI0_init(void);
  4. volatile uint8_t receiveData = 0;
  5. volatile uint8_t writeData = 0;
  6. void SPI0_init(void)
  7. {
  8. PORTA.DIR &= ~PIN4_bm; /* Set MOSI pin direction to input */
  9. PORTA.DIR |= PIN5_bm; /* Set MISO pin direction to output */
  10. PORTA.DIR &= ~PIN6_bm; /* Set SCK pin direction to input */
  11. PORTA.DIR &= ~PIN7_bm; /* Set SS pin direction to input */
  12. SPI0.CTRLA = SPI_DORD_bm /* LSB is transmitted first */
  13. | SPI_ENABLE_bm /* Enable module */
  14. & (~SPI_MASTER_bm); /* SPI module in Slave mode */
  15. SPI0.INTCTRL = SPI_IE_bm; /* SPI Interrupt enable */
  16. }
  17. ISR(SPI0_INT_vect)
  18. {
  19. receiveData = SPI0.DATA;
  20. SPI0.DATA = writeData;
  21. SPI0.INTFLAGS = SPI_IF_bm; /* Clear the Interrupt flag by writing 1 */
  22. }
  23. int main(void)
  24. {
  25. SPI0_init();
  26. sei(); /* Enable Global Interrupts */
  27. while (1)
  28. {
  29. ;
  30. }
  31. }
 楼主| 小明的同学 发表于 2024-3-30 22:06 | 显示全部楼层
  1. #include <avr/io.h>
  2. void SPI0_init(void);
  3. void slaveSelect(void);
  4. void slaveDeselect(void);
  5. uint8_t SPI0_exchangeData(uint8_t data);
  6. void SPI0_init(void)
  7. {
  8. PORTA.DIR |= PIN4_bm; /* Set MOSI pin direction to output */
  9. PORTA.DIR &= ~PIN5_bm; /* Set MISO pin direction to input */
  10. PORTA.DIR |= PIN6_bm; /* Set SCK pin direction to output */
  11. PORTA.DIR |= PIN7_bm; /* Set SS pin direction to output */
  12. SPI0.CTRLA = SPI_CLK2X_bm /* Enable double-speed */
  13. | SPI_DORD_bm /* LSB is transmitted first */
  14. | SPI_ENABLE_bm /* Enable module */
  15. | SPI_MASTER_bm /* SPI module in Master mode */
  16. | SPI_PRESC_DIV16_gc; /* System Clock divided by 16 */
  17. SPI0.CTRLB |= SPI_MODE_3_gc; /* Data Mode 3 */
  18. }
  19. uint8_t SPI0_exchangeData(uint8_t data)
  20. {
  21. SPI0.DATA = data;
  22. while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
  23. {
  24. ;
  25. }

  26. return SPI0.DATA;
  27. }
  28. void slaveSelect(void)
  29. {
  30. PORTA.OUT &= ~PIN7_bm; // Set SS pin value to LOW
  31. }
  32. void slaveDeselect(void)
  33. {
  34. PORTA.OUT |= PIN7_bm; // Set SS pin value to HIGH
  35. }
  36. int main(void)
  37. {
  38. uint8_t data = 0;
  39. SPI0_init();
  40. while (1)
  41. {
  42. slaveSelect();
  43. SPI0_exchangeData(data);
  44. slaveDeselect();
  45. }
  46. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

159

主题

1640

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部