xref: /aosp_15_r20/external/pigweed/pw_spi_mcuxpresso/spi_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14 
15 #include "pw_spi_mcuxpresso/spi.h"
16 
17 #include "board.h"
18 #include "pw_bytes/array.h"
19 #include "pw_spi/device.h"
20 #include "pw_status/status.h"
21 #include "pw_unit_test/framework.h"
22 
23 namespace pw::spi {
24 namespace {
25 
26 auto* spi_base = SPI14;
27 constexpr auto kClockNumber = 14;
28 constexpr uint32_t baud_rate_bps = 10000000;
29 constexpr Config configuration{.polarity = ClockPolarity::kActiveHigh,
30                                .phase = ClockPhase::kRisingEdge,
31                                .bits_per_word = BitsPerWord(8),
32                                .bit_order = BitOrder::kMsbFirst};
33 
TEST(Configure,ConfigurationSuccess)34 TEST(Configure, ConfigurationSuccess) {
35   McuxpressoInitiator spi(
36       spi_base, CLOCK_GetFlexcommClkFreq(kClockNumber), baud_rate_bps);
37   auto status = spi.Configure(configuration);
38 
39   EXPECT_EQ(status, OkStatus());
40 }
41 
TEST(ReadWrite,PollingWriteSuccess)42 TEST(ReadWrite, PollingWriteSuccess) {
43   const auto blocking = true;
44   constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
45   static auto destination = bytes::Array<0xff, 0xff, 0xff, 0xff, 0xff>();
46 
47   McuxpressoInitiator spi(spi_base,
48                           CLOCK_GetFlexcommClkFreq(kClockNumber),
49                           baud_rate_bps,
50                           blocking);
51   auto status = spi.Configure(configuration);
52   ASSERT_EQ(status, OkStatus());
53 
54   status = spi.WriteRead(source, destination);
55   EXPECT_EQ(status, OkStatus());
56 }
57 
TEST(ReadWrite,IRQWriteSuccess)58 TEST(ReadWrite, IRQWriteSuccess) {
59   const auto blocking = false;
60   constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
61   static auto destination = bytes::Array<0xff, 0xff, 0xff, 0xff, 0xff>();
62   McuxpressoInitiator spi(spi_base,
63                           CLOCK_GetFlexcommClkFreq(kClockNumber),
64                           baud_rate_bps,
65                           blocking);
66   auto status = spi.Configure(configuration);
67   ASSERT_EQ(status, OkStatus());
68 
69   status = spi.WriteRead(source, destination);
70   EXPECT_EQ(status, OkStatus());
71 }
72 
TEST(ReadWrite,WriteOnlySuccess)73 TEST(ReadWrite, WriteOnlySuccess) {
74   const auto blocking = false;
75   constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
76   McuxpressoInitiator spi(spi_base,
77                           CLOCK_GetFlexcommClkFreq(kClockNumber),
78                           baud_rate_bps,
79                           blocking);
80   auto status = spi.Configure(configuration);
81   ASSERT_EQ(status, OkStatus());
82 
83   status = spi.WriteRead(source, {});
84   EXPECT_EQ(status, OkStatus());
85 }
86 
TEST(ReadWrite,UseDeviceWriteOnlySuccess)87 TEST(ReadWrite, UseDeviceWriteOnlySuccess) {
88   const auto blocking = false;
89   constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
90   McuxpressoInitiator initiator(spi_base,
91                                 CLOCK_GetFlexcommClkFreq(kClockNumber),
92                                 baud_rate_bps,
93                                 blocking);
94   McuxpressoChipSelector spi_selector(initiator, 0);
95   sync::VirtualMutex spi_lock;
96   sync::Borrowable<Initiator> spi(initiator, spi_lock);
97   Device device(spi, configuration, spi_selector);
98 
99   EXPECT_EQ(device.WriteRead(source, {}), OkStatus());
100 }
101 }  // namespace
102 }  // namespace pw::spi
103